整数在内存中的存储
-
补码
正数补码-不变 负数补码-各不相同
整数在二进制中以补码的形式存储,原因在于,补码可以将符号位和数值域统一处理,加减法也可以统一处理,原码补码相互转换方法一致,不需要额外的硬件电路。
转换成%d的形式时需要整形提升, 用符号位填充高位
-
大小端存储
大端存储-低位字节存储到高地址处 小端存储-高位字节存储到低地址处
判断大小端存储的程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n = 1;
if (*(char*)&n = 1)
//这里取n的地址之后强制转换成char*是为了获得第一个字节的地址,然后解引用就是第一个字节的内容
printf("小端");
else
printf("大端");
return 0;
}
浮点数在内存中的存储
同样是9,想以整数或浮点数的形式打印出来,结果是不一样的:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 9;
float* p = (float*)&a;
printf("%d\n", a);
//9
printf("%f\n", *p);
//0.000000
*p = 9.0;
printf("%d\n", a);
//1091567616
printf("%f\n", *p);
//9.000000
return 0;
}
原因在于他们的存储方式不同。
浮点数的存储方式:
S:符号位 M:有效数字[1,2) E:指数位
如:5.5-->101.1-->1.011*2^2
IEEE 754规定:
对于32位的浮点数(foat),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
E加上中间数127(8位)或者1023(11位),以确保E是正的
浮点数的存储导致有很多小数是无法精确存储的,只能尽可能精确的存储。正因为double存储的位数多,所以精度更高