整数在内存的存储形式
- 符号位用0示意正,1示意负。
- 整数在内存中是以补码的模式保留的(负数的源反补码雷同,正数的源反补码不同)
-
留神:变量类型在读取时会有一个整形晋升的问题
- 整形晋升在存储变量时是没有的,只在读取时存在
- 例如:char类型的数,输入的用%d整形输入。
- 整形晋升时,有符号类型依据首位进行补位,无符号类型补0。
- 整形晋升后,留神负数的源反补码雷同。
int main()
{
char b = 229;
//存储时:229是负数,源反补码都雷同
//0000 0000 0000 0000 0000 0000 1110 0101 负数首位为0,其余位补0
//b内存中存储的是:1110 0101
//读取时,char类型打印为整型,整型晋升
//%d 示意有符号整形,首位为符号位,1110 0101首位为1,正数
//如果是打印 %u 打印无符号整形,所有位都为数值位,源反补码雷同。
//char类型为有符号类型,依据首位决定补什么
//补码:1111 1111 1111 1111 1111 1111 1110 0101 首位为1,全副补1
//反码:1111 1111 1111 1111 1111 1111 1110 0100 补码减一
//源码:1000 0000 0000 0000 0000 0000 0001 1011 取反
//输入的值: -27
printf("%d",b);
return 0;
}
大小端字节序存储
- 以字节为单元进行存储。
0x12345678 十六进制位 12是最高位字节的数据,78是最低位字节的数据
大端存储: 低位 12 34 56 78 高位 把高位字节数据寄存在低位处
小端存储: 低位 78 56 34 12 高位 把低位字节数据寄存在低位处
浮点型在内存中的存储
- 留神:浮点数在内存中可能不能准确保留,所以个别不必 == 号进行比拟,个别是用差值,看是否在肯定范畴内。
存储浮点数时
- 整数和浮点数在内存中的存储形式是有差别的。
- 依据国内IEEE754的规范:任意二进制浮点数都能够示意成下列模式。
浮点数的计数形式:(-1)^S*M*2^E
(-1)^S示意符号位,S为0,则为负数;为1,则为正数
M示意有效数字的,大于1,小于2 (用二进制示意的)
2^E示意指数位。
内存中存储的就是S、E、M三个数据
(对应32位float类型)
[bit0]1bit存储S,[bit1-bit8]8bit存储E,[bit9-bit31]23bit存储M。
(对应64位double类型)
[bit0]1bit存储S,[bit1-bit11]11bit存储E,[bit9-bit63]52bit存储M。
-
留神:计算机外部保留M时,默认这个数的第一位总是1,所以能够省略,只保留小数点后的位数。
- 例如:1.25 换成二进制是 1.01 ,M位只保留 01 。
- 留神:存储E时,要在原数值上加上127(float)或者1023(double)进行修改。
float f = 5.5;
//二进制模式 :101.1
//换成国际标准 :(-1)^0 * 1.011 * 2^2
//S=0;
// E=2; 须要加127修改 所以 E = 129
// M=1.011 相当于存储1.01100000000000000000000,小数点前面补0
//内存中存储:0 10000001 01100000000000000000000
取浮点数时
-
当E全为0时,取浮点数的指数E时,E = 1-127(或者1-1023)
- 并且M的值,不再加上整数位的 1,而是还原为 0.xxxx 的小数。
- 当E全为1时,如果有效数字M全为0,则示意正负无穷大(正负取决于符号位S)
-
当E有0有1时,E = 计算值 – 127(或1023)
- 并且将有效数字M的值加上整数位的 1,失去1.xxxx的小数。
int main()
{
int n = 9;
float* pfloat = (float*)&n;
//源反补雷同:0000 0000 0000 0000 0000 0000 0000 1001
//以float形式读取:
// bit0位为0 S=0
// bit1-bit8位全为0 E=1-127=-126 (E全为0,M不再加上整数位的1)
// bit9-bit31 M = 000 0000 0000 0000 0000 1001 == 0.000 0000 0000 0000 0000 1001 (留神M的值是用二进制间接计算的)
// *pfloat = (-1)^0 * 0.000 0000 0000 0000 0000 1001 * 2^(-126)
printf("n的值为:%d\n", n);
printf("*pfloat的值为:%f\n", *pfloat);
*pfloat = 9.0;
printf("n的值为:%d\n", n);
printf("*pfloat的值为:%f\n", *pfloat);
return 0;
}=
全局变量和局部变量的初始化问题
- 全局变量未初始化时,默认值为0。
- 局部变量未初始化时,程序会报错。
发表回复