C语言数据存储
一、整形在内存中的存储
整形数字在内存中以二进制的的数据进行存储,整数有三种编码:原码、反码、补码
源码:十进制数据转为二进制,就为源码
反码:符号位不变,其他位取反就为整数的反码
补码:反码 + 1,就为补码
正整数,源码、反码、补码相同,负整数,原码、反码、补码需要计算得到
整形数据在内存中存储的是补码。
为什么计算机中一律采用补码进行存储?
使用补码,可以将符号位和数值域统一处理;CPU中只有加法计算,可以将加法和减法进行统一处理,补码与源码相互转换其运算过程是相同的(补码 = 源码取反 + 1,原码 = 补码取反 + 1),不需要额外的硬件电路。
1、大小端
小端字节序存储:把一个数字的高位字节序存放在高地址中的方式
大端字节序存储:把一个数字的高位字节序放在低地址中的方式
大小端存储方式取决于硬件,常见的x86是小端模式
整形提升:
1、正数整形提升补码高位补0
2、负数整形提升补码高位补1,符号位不变
int 类型转 char类型时,采用低位截断(截断截的是存储在内存中的补码的低位),与大小端没有关系
打印a,char 在内存中表示有符号char,取值范围:-128 ~ 127,所以-128可以保存在char中,-128在内存中的补码11111111 11111111 11111111 10000000,截断低8位10000000,因为打印的方式为u%,那么需要做整形提升,10000000为-128,整形提升得到内存中的数据:11111111
11111111 11111111 10000000(补码),但是要求是以无符号的整数打印,所以最高位1有权重,表示2的31次方,所以char a = -128已无符号整形的格式打印的结果为4294967168,结果非常大。
二、浮点型存储
char、int、uint、long、long long这些整形定义在limits.h的头文件中
float、double、long double这些浮点型定义在float.h的头文件中
从此图中看出,整形和浮点型在内存中存储的方式是不一样的。
1、浮点型数据存储规则