- 数据类型
- 整型在内存中的存储
- 大小端字节序
- 浮点型在内存中的存储
数据类型
整型家族
char unsigned char signed char;
short unsigned short signed short;
int unsigned int signed int;
long. unsigned long signed long;
unsigned 无符号数值 在现实生活中有些数值 只有正数 没有负数 (身高)
signed 有符号数值 像温度 有正数也有负数
单写char类型 未明确标出是什么类型数值 而取决于编译器;
而int short等 统一默认为有符号类型 ;
浮点型家族
float. double
构造类型 自定义类型
数组 结构体struct 枚举类型enum 联合类型union
整型在内存中的存储
原码 反码 和 补码
原码 : 即该数值的二进制序列
反码 : 即该数值的二进制序列的基础上,符号位不变,其他为取反
补码 : 即该数值的反码的基础上,+1;
int b = -10;
原码 10000000 00000000 00000000 00001010
反码 11111111 11111111 11111111 11110101
补码 11111111 11111111 11111111 11110110
符号位:在32位机器下 开头第一个数值 为符号位 1为负值 0为正值
剩下31位机位有效数值位
对于整型来说在内存中存储的是补码;
而显示给我们看的 是十六进制;
通过这个例子我们能明白整型数据在内存中是以补码存储的,不过你肯定要问 为啥内存里显示的是F6 FF FF FF 这就要介绍下大小端字节序了
大小端字节序
一个数值超过一个字节(8个bit)要存储到内存中 就会出现顺序的问题;
大端:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;
小端:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中;
什么是数据的 高位 低位
例如123
1 (百位)2(十位) 3(个位)
而1相对于23就是高位
而3相对于12就是低位
浮点型在内存中的存储
浮点数存储规则
国际标准 任意一个二进制浮点数V可以表示成下列形式
- (-1)^S*M*2^E
- (-1)^S表示符号位,当S = 0 ,V为正数,当S=1,V为负数;
- M表示有效数字(肯定是大于等于1,小于2)
- 2^E表示指数位
eg V = 5.5 = 1 0 1 . 1 = 1.011*2^2 = (-1)^0*1.011*2^2
S = 0 , M = 1.011 , E = 2
关于M,E的特殊规定
M的取值范围一定在 1 <= M < 2 内;所以在计算机内部存储M时 会默认这个数的第一位总是1;
为了提高精度,默认第一位为1 ,且不存储 ,在后面读取时1再加上去
E 指数E 为一个无符号整数 但现实生活中 科学计数法中 E是可以出现负数
所以 规定:存入内存时 E的真实值必须加上一个中间值
float类型 + 127
double类型 + 1023
在读取 中E从内存中取出还可以分成三种情况
- E不为全0 或不为全1
- E为全0
- E为全1
在 E不为全0 或不为全1中 即指数E(减去127(1023))得到真实值,M再加1;
在 E为全0中 指数E等于(1-127)或者(1-1023)1.xxxxx * 2^-127是一个非常非常小的数字
有效数字M不再加上第一位的1,而是0.xxxx 无限接近于0的很小的数字
在 E为全1中 1.xxxxx*2^128 是一个非常非常大的正数,无穷大;
结尾
数据在内存中的存储介绍就到这里了,都看到这里了 不给点赞吗 QAQ