C语言_常用数据类型地址的理解

常用基本数据类型:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>int main(){printf("基本数据类型:\n");printf("char: %d\n", sizeof(char));printf("int: %d\n", sizeof(int));printf("double: %d\n", sizeof(double));}

在这里插入图片描述
size的单位是字节,每个字节占8位

调用这些数据结构实质上就是申请相对应大小的逻辑物理地址,编译器和操作系统会管理这些内存,将虚拟内存地址映射到物理内存地址,因此程序员通常无需担心物理内存地址。

这样的好处就是可以运行多个进程,而无需考虑地址冲突的问题

获取来的空间的作用:

就对数据类型char来说获取的空间为1字节,即8位大小,那么这8位本质上是用来干嘛的?

实质上获取的空间就是用二进制存等值的数据

例如:

char a = 12

本质上就是将(10)12转成二进制再写入a分配的8个字节的空间内

a = 00001100

其中第一位是符号位1代表正数,0代表负数,所以有符号char类型正数的范围就是

00000000 ~ 01111111 //转换成10进制就是(0 ~ 127) 或 (0 ~ 2^7 - 1)

那么负数怎怎么表示?

10000000 => -2^7或-128

那么-127就表示为:

10000001 //也就是 -128 + 1

那么-1就表示为:

11111111 // 也就是-128 + 127

这也就是为什么有符号char类型的负数范围为-1 ~ -128

当然对于无符号的数据类型unsigned char,即默认其为正数,第一位不再用以判别符号

10000000 => 128
10000001 => 128 + 1 => 129
//数据范围0 ~ 255

当然unsigned修饰其他数据类型也是一样的效果

这也就是为什么输入的整数超范围了就会变成负数:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>int main(){char a = 128;printf("%d", a);//10000000return 0;
}

在这里插入图片描述

也可以在程序中溢出成0,但赋值不行:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>int main(){char a = 255;printf("%d", a + 1);//11111111 + 1return 0;
}

在这里插入图片描述


至于为什么可以输出字符,存入字符,这都是因为字符对应ascii码,这个码本质上就是整数,printf通过%c查找对应字符输出罢了

例如:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>int main(){int text1 = 97;char text2 = 'c';char text3 = 99;printf("text1: %c\n", text1);printf("text1: %d\n", text1);printf("text2: %c\n", text2);printf("text2: %d\n", text2);printf("text3: %c\n", text3);printf("text3: %d\n", text3);
}

在这里插入图片描述


需要注意的是:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>int main(){double a = 1.5;printf("%d", a);//11111111return 0;
}

在这里插入图片描述
原因是:

在你的代码中,你声明了一个double类型的变量a,并将其初始化为1.5。然后,你使用printf(“%d”, a);来打印它。这实际上是一种未定义行为,因为你试图将double类型的值用%d格式字符串打印为整数,这可能导致不可预测的结果。

在某些情况下,编译器可能会将未定义行为的代码解释为0,但这是不可预测的行为,不应该依赖于这种行为。


stdint.h中的常用数据类型

在头文件中:

#include<stdint.h>

常用的数据类型有:

int8_t:有符号8位整数。
uint8_t:无符号8位整数。
int16_t:有符号16位整数。
uint16_t:无符号16位整数。
int32_t:有符号32位整数。
uint32_t:无符号32位整数。
int64_t:有符号64位整数。
uint64_t:无符号64位整数。

对其中例如uint8_t拆解分析

u指unsigned修饰 int指整形 8指占据8位 _t表示类型也就是type

其他的组成逻辑也是一样


还有值得一提的就是c中的数组与char指针:

char a[100];

申请char类型变量100空间,这个空间没有初始化,如果打印的话会发现内部装着一些垃圾信息,是之前程序留下来的

char * a = "abc";
char b[3];
b[0] = 'a';
b[1] = 'b';
b[2] = 'c';

上述操作是等效的b其实也是个指针

#include <stdio.h>int main(){char * a = "abc";char b[] = "abc";a++;char * q = b;q++;printf("%s\n",a);printf("%s\n", q);return 0;
}

在这里插入图片描述

本质上一样,只是数组b是个不能更改的变量类似:

char * const b

指针常量罢了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统——内存映射文件(王道视频p57)

1.总体概述&#xff1a; 2.传统文件访问方式&#xff1a; 我认为&#xff0c;这种方式最大的劣势在于&#xff0c;如果要对整个文件的不同部分进行多次操作的话&#xff0c;这样确实开销可能会大一些&#xff0c;而且程序员还要指定对应的“分块”载入到内存中 3.内存映射文件…

【网络】HTTPS协议

HTTPS协议 一、什么是HTTPS二、数据的加密1、常见的加密方式2、数据摘要&#xff08;数据指纹&#xff09;3、数字签名 三、HTTPS 的工作过程探究1、方案 1 - 只使用对称加密2、方案 2 - 只使用非对称加密3、方案 3 - 双方都使用非对称加密4、方案 4 - 非对称加密 对称加密 四…

文件夹重命名与大小写转换:提高文件检索准确性的技巧

在文件管理中&#xff0c;文件夹的命名和大小写转换是非常重要的操作。正确的文件夹命名和大小写转换可以提高文件检索的准确性&#xff0c;从而提高工作效率和文件管理的便利性。现在来看云炫文件管理器如何进行文件夹重命名和大小写转换的技巧&#xff0c;以帮助您更好地管理…

2023年金融科技建模大赛(初赛)开箱点评

各位同学大家好&#xff0c;我是Toby老师。2023年金融科技建模大赛&#xff08;初赛&#xff09;从今年10月14日开始&#xff0c;11月11日结束。 比赛背景 发展数字经济是“十四五”时期的重大战略规划。2023年&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》…

MASK-RCNN tensorflow环境搭建

此教程默认你已经安装了Anaconda&#xff0c;且tensorflow 为cpu版本。为什么不用gpu版本&#xff0c;原因下面解释。 此教程默认你已经安装了Anaconda。 因为tensorflow2.1后的gpu版&#xff0c;不支持windows。并且只有高版本的tensorflow才对应我的CUDA12.2&#xff1b; 而…

16. 机器学习 - 决策树

Hi&#xff0c;你好。我是茶桁。 在上一节课讲SVM之后&#xff0c;再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始&#xff0c;来看下面这张图&#xff1a; 假设我们的x1 ~ x4是特征&#xff0c;y是最终的决定&#xff0c;打比方说是…

Pikachu(一)

暴力破解 Burte Force&#xff08;暴力破解&#xff09;概述 “暴力破解”是一攻击手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高…

Jmeter只能做性能测试吗?

Jmeter除了可以性能测试&#xff0c;还能做接口测试 1、Jmeter和Fiddler&#xff0c;Postman有什么区别? Fiddler&#xff1a;虽然有接口测试功能&#xff0c;很少用来做接口测试。 一般用Fiddle来做抓包和异常测试&#xff0c;辅助接口测试。Postman&#xff1a; 是接口调试…

QML 仪表盘小示例

本次项目已发布在CSDN->GitCode,下载方便,安全,可在我主页进行下载即可,后面的项目和素材都会发布这个平台。 个人主页:https://gitcode.com/user/m0_45463480怎么下载:在项目中点击克隆,windows:zip linux:tar.gz tar # .pro TEMPLATE = appTARGET = dialcontrol​#…

【MySQL】MVCC机制(undo log,read view)

文章目录 前言一. 预备知识二. 模拟MVCC三. Read View四. RC与RR的本质区别结束语 前言 MVCC&#xff08;多版本并发控制&#xff09;是一种用来解决读-写冲突的无锁并发控制 MVCC为事务分配单向增长的事务ID&#xff0c;为每个修改保存一个版本&#xff0c;版本与事物ID相关联…

【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)

目录 0. 前言 1. Cifar10数据集 2. AlexNet网络模型 2.1 AlexNet的网络结构 2.2 激活函数ReLu 2.3 Dropout方法 2.4 数据增强 3. 使用GPU加速进行批量训练 4. 网络模型构建 5. 训练过程 6. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…