和黛玉学编程..............>
整数在内存的存储
之前就说过,数字二进制有3种保存方法,原码,反码,补码;而电脑存储整数的时候使用补码,这是因为cpu中只有加法器
三种表示方法都有符号位和数字位,也就是signed 和unsigned ,有符号位就是正负区别啦
1.正数的原码,反码,补码都相同的
2.负数原码:按照二进制表示的
反码:符号位不变,其他按位取反
补码:反码基础上加一
大小端字节序和字节序判断
大小端
超过一个字节的数据在内存中存储的时候就有存储顺序的问题,按照不同的存储顺序我们分为大端字节和小端字节
大端存储模式:数据的低位字节内容保存在内存的高地址,高位字节内容保存在内存的低地址
小端存储模式:和上面相反
为什么要有这个大小端呢?
在计算机系统中,我们是以字节为单位的,每个地址单元对应着一个字节,一个字节有8个比特位,但是在C语言中有8比特的char,还有16比特的short以及32比特的Long类型(一些编译器), 对于16或者32位的处理器,必然存在一个如何将多个字节安排的问题
浮点数在内存中的存储
举例:5.0,二进制是101.0,相当于1.01x2^2,S=0;M=1.01;E=2
5.5,二进制是101.1,因为0.5是1x2^-1,表示的话就是(-1)^0 *1.011*2^2
但是总有些数字可能需要100位1000位才能表示出来,所以有些数字存储的时候与实际的有 误差
浮点数存的过程
M:前面说过,M是1到2之间的,所以M可以写成1.xxxxxx,其中xxxxx表示小数部分,所以在计算机内部保存的时候,默认第一位总是1 ,因此可以被舍去,只保存后面的部分,这样子可以节省一位有效数字,存储的范围也就大了。
E:
如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我
们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001
在内存中分为三种情况
1.E不全为0或者不全为1:
指数E的计算值减去127(或者1023),得到真实值,再将有效数字M前加上第一 位的1
2.E全为0;
浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位 的 1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
3.E全为1:
如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s
相关代码你们可以自己试试呀
#include <stdio.h> 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; }
就到这里啦,如果对你有帮助,看希望可以收到你的小赞,你的赞将给创作者的我带来好多天的开心喲。