tip:无符号数的原码、反码、补码相同
机器的字节序
以00000001为例:(低 ------> 高)
大端存储:00 00 00 01
小端存储:01 00 00 00
设计程序判断当前机器的字节序:
int a = 1;
char* p = (char*) &a;
if(*p == 1)
printf("小端\n");
else
printf("大端\n");
整型数据
二进制32bit位存储,分为原码、反码、补码,计算机内存中存储的为补码
(正数的原码、反码、补码相同;负数的符号位为1,正数为0)
范围为:[-(2^31-1) , 2^31]
字符型数据
二进制8bit位存储
范围为:[-(2^7-1) , 2^7]
浮点型数据
国际标准IEEE754
任意一个二进制浮点数可以表示成下面的形式:
(-1)^S * M * 2^E
S:符号位
M:有效数字,[1 , 2)
E:指数位
例:
浮点数5.5——十进制
二进制101.1—>1.011 * 2^2 —> (-1)^0 * 1.011 * 2^2
S=0; M=1.011; E=2
单精度:对于32位的浮点数,最高1位是符号位S,接着8位是指数E,剩下23位为有效数字M
双精度:对于64位的浮点数,最高1位是符号位S,接着11位是指数E,剩下52位为有效数字M
存储细节:
M:存储1.xxxxx小数点后的数字,如1.01存入01,后面补0
E:
float:原数+127
double:原数+1023
例:
float 5.5
S = 0; M = 011; E = 2+127 = 129
存入二进制:0 10000001 01100000000000000000000
E从内存取出
- E不全为0,1
正常取出,E-127或E-1023,将有效数字M前加上第一位的1 - E全为0
E=1-127或1-1023为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxx的小数,为了表示为±0,或接近0的很小的数字 - E全为1
此时有效数字M全为0,表示为±无穷(正负号取决于符号位S)