泉州网站建设qzdzi,wordpress首页图片,wordpress 加子目录,在线制作头像模板整数在内存中的存储
整数的2进制表⽰⽅法有三种#xff0c;即原码、反码和补码。
对于整形来说#xff0c;数据存放内存中的其实是补码。
在计算机系统中#xff0c;数值一律用补码来表示和存储。原因是#xff0c;使用补码#xff0c;可以使符号位和数值域统一处理即原码、反码和补码。
对于整形来说数据存放内存中的其实是补码。
在计算机系统中数值一律用补码来表示和存储。原因是使用补码可以使符号位和数值域统一处理同时还可以使加法和减法统一处理CPU中只有加法器。此外原码和补码相互转换运算过程相同不需要额外硬件电路。
大小端存储
⼤端存储模式是指数据的低位字节内容保存在内存的⾼地址处⽽数据的⾼位字节内容保存在内存的低地址处。 ⼩端存储模式是指数据的低位字节内容保存在内存的低地址处⽽数据的⾼位字节内容保存在内存的⾼地址处。 为何存在大小端
大小端之分主要源于计算机系统中多字节数据的存储顺序问题。在计算机系统中每个地址单元对应着一个字节而一个字节为8位。然而对于位数大于8位的处理器如16位或32位的处理器寄存器宽度大于一个字节因此需要将多个字节进行排列。
#include stdio.hint check_sys()
{int i 1;return (*(char *)i);
}int main()
{int ret check_sys();if(ret 1)
{printf(⼩端\n);
}else
{printf(⼤端\n);
}return 0;
}联合体
int check_sys()
{{int i;char c;}un;un.i 1;return un.c;
}浮点数在内存中的存储
int main()
{int n 9;float *pFloat (float *)n;printf(n的值为%d\n,n);printf(*pFloat的值为%f\n,*pFloat);*pFloat 9.0;printf(num的值为%d\n,n);printf(*pFloat的值为%f\n,*pFloat);return 0;
}在这个程序中输出为9 0.000000 一个很大的数值 9.000000
任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式 V (-1) ^S*M*2^E • (-1)^S 表⽰符号位当S0V为正数当S1V为负数 • M表⽰有效数字M是⼤于等于1⼩于2的 • E 表⽰指数位 在计算机内部保存M的时候默认第一位总是1所以可以舍去只保留后面的部分。等到读取的时候再把第⼀位的1加上去。这样做的⽬的是节省1位有效数字。以32位浮点数为例留给M只有23位将第⼀位的1舍去以后等于可以保存24位有效数字。
E为一个无符号整数但是科学计数法中的E是可以出现负数的。等到读取的时候再把第⼀位的1加上去。这样做的⽬的是节省1位有效数字。以32位浮点数为例留给M只有23位将第⼀位的1舍去以后等于可以保存24位有效数字。
指数E从内存中取出可以再分成三种情况
E不全为0或不全为1
指数E的计算值减去127或1023得到真实值再将有效数字M前加上第⼀位的1。
E全为0
浮点数的指数E等于1-127或者1-1023即为真实值有效数字M不再加上第⼀位的1⽽是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0以及接近于0的很⼩的数字。
E全为1:
如果有效数字M全为0表⽰±⽆穷⼤正负取决于符号位s。为什么 9 还原成浮点数就成了 0.000000 9以整型的形式存储在内存中得到如下⼆进制序列
1 0000 0000 0000 0000 0000 0000 0000 1001
最后23位的有效数字M00000000000000000001001。 由于指数E全为0所以符合E为全0的情况。因此浮点数V就写成 V(-1)^0 × 0.00000000000000000001001×2^(-126)1.001×2^(-146) 显然V是⼀个很⼩的接近于0的正数所以⽤⼗进制⼩数表示就是0.000000。
浮点数9.0为什么整数打印是 1091567616
⾸先浮点数9.0等于⼆进制的1001.0即换算成科学计数法是1.001×2^3 所以9.0 (-1) *(1.001) ∗ 2^3。
那么第⼀位的符号位S0有效数字M等于001后⾯再加20个0凑满23位指数E等于3127130即10000010 所以写成⼆进制形式应该是SEM即0 10000010 001 0000 0000 0000 0000 0000 。
练习
signed char所有的最高位被当作符号位剩下的为数值位。内存中存放的数据为补码。最前面为1是负数。符号位不变其他位置按位取反再1。 unsigned char 0-255 这三种类型在内存种存储时的补码是相同的都是11111111。char类型要提升为int类型才能打印整形提升的时候要补充符号位111111111111111打印-1。signed char同理。unsigned0000000011111111打印256。 打印的是无符号数。-128是1000000001000000%u打印认为a中存储的是无符号数首先要整型提升。其在内存中的补码为1111 1111 1111 1111 1111 1111 111。打印的值是二进制补码所对应的十进制。128放入就不是128了因为signed int所存储的值是-128127。只能存8个比特位10000000。高位补11111111110000000。unsigned是无符号是但是用%d又被当作无符号类型。
#include stdio.h
int main()
{char a[1000];int i;for(i0; i1000; i){a[i] -1-i;}printf(%d,strlen(a));return 0;
}求得的是字符串的长度并且是\0(asc码值为0)之前的长度。 顺序为-1 -2 -3 ……-128 127 126 ……0。一共有255个数字。 #include stdio.h
int main()
{unsigned int i;for(i 9; i 0; i--){printf(%u\n,i);}return 0;
}
unsigned char只能存到255取值范围为0-255。永远大于等于0所以永远成立。
#include stdio.hint main()
{int a[4] { 1, 2, 3, 4 };int *ptr1 (int *)(a 1);int *ptr2 (int *)((int)a 1);printf(%x,%x, ptr1[-1], *ptr2);return 0;
}相当于整型加整型。
4 20000000