一、整形在内存中的存储
1.整形的大小为4字节,共计32比特位,首位为符号位,0为正,1为负。
2.剩余位则存储数据的补码。
原码:将数据翻译为二进制数据。
反码:原码符号位不变,其余位取反。
补码:反码 +1。
注:正数的原反补一样!
3.大端与小端。
大端:指数据低位存于高地址,数据高位存于低地址。
小端:指数据低位存于低地址,数据高位存于高地址。
举例:int a=10;
故我的机器为小端模式。
那怎样用代码判断机器的大小端呢?
我们创建一个int变量,初始化为1;
将其地址强转为char*并解引用;
相当于4字节中取1个低地址字节;
取出的是1则说明低位存于低地址,是小端。
取出的是0则反之。
实现:
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main(int argc, char* argv[])
{
int ret = check_sys();
if (ret == 1)
{
printf("小端");
}
else{
printf("大端");
}
return 0;
}
利用联合的特性,也可将代码写为:
int check_sys()
{
union
{
int x;
char y;
}un;
un.x = 1;
return un.y;
}
二、浮点型在内存中的存储
对于单精度浮点数
存储时分3部分:
1.S 符号位 0为正,1为负;
2.E 指数位。数据可写成1. xxx*2^E的形式;
3.M 有效数字位,即1.xxx的这部分,大于等于1小于2.
计算机在保存M时,因为总数大于1的,因此1被舍去,只保存小数点后面的xxx部分。
对于E ,因为指数可以为负数,但这里E是一个无符号整数,所以规定存入E时必须加上一个中间数,这里中间数为127;对于double float则是1023。
举个栗子:
float a=5.5;
a存储时,现将5.5转为二进制的科学计数法
1.011*2^2
S=0 E=2+127 M=011 00000000000000000000
最终内存存储为
0 10000001 01100000000000000000000
这里E若全为0或全为1时很特殊。
1.E全为0:
此时有效数字M不再加上1,指数为1-中间数。这样做为了表示0,以及接近0的数字!
2.E全为1:
此时,若M全为0,表示正负无穷大!
双精度浮点数存储规则一致,只不过E占11bit M占52bit 中间数为1023