数据在内存中的存储(C语言)
文章目录
Ⅰ 整型在内存中的存储
在讲解整型在内存中的存储之前,带大家了解一下:
🎄二进制位:**逢二进一**🎄
整数的二进制表示方法:原码、反码、补码。
十进制位就是平常我们常见的数字:1000、100、10、1等,这些都是十进制表示方法。
在一个整数进行存储时,会将整数的十进制转换成二进制位,而最后在电脑内存储的是整数二进制的补码,有人好奇就问了什么是原码、反码、补码?
1. 原码、反码、补码的讲解
接下来就给大家讲解一下什么是原码、反码、补码。
三种表示方法均有符号位和数值位:
符号位为 0 表示正数,符号位为 1 表示负数。
最高位是符号位,其他位就是数值位
正数的符号
注意:正数的原、反、补码是相同的
如下图所示:
负数的原、反、补码是根据一下规律得到
原码:直接将数值按照二进制位得到的就是原码。
反码:是原码的符号位不变其它位按位取反得到反码
补码:反码加1得到补码
如下图所示:
对于整形来说:数据存放内存中其实存放的是补码。
为什么在计算机中存放的是补码呢?
原因:主要是使用补码,可以将符号位和数值位进行统一处理,而计算机当中(CPU只有加法器)加法和减法会进行同一处理,此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。
Ⅱ大小端字节序和字节判断
当我们知道整数在内存中的存储后,我们来调试一下代码:
int main()
{
int a=0x11223344;
return 0;
}
如下图所示
调试后发现 a 在计算机中存储的字节顺序是倒着存储的。这是为什么呢?
2. 计算机中的大小端系统
有人好奇就会问了,什么是大小端?
在计算机当中,有超过的一个字节的存储时,会跟据电脑系统的存储有关,大小端的存储就是两种顺序的不同而已。
大端(存储)模式:大端存储方式是将数据低字节存储到计算机内存的高地址位,而数据的高字节位存储到计算机中的低地址位。
小端(存储)模式;小端存储方式是将数据高字节存储到计算机内存的高地址位,而数据的低字节位存储到计算机中的低地址位。
规律
内存条的地址高低位置如下图所示
字节的高低位置如下图所示
小端: 高高低低
大端:低高低高
Ⅲ 浮点类型在内存中的存储
请看以下代码
int main()
{
int n = 9;
float* pf = (float*)&n;
printf("n的值为:%d\n",n);
printf("*pf的值为:%f\n", *pf);
*pf = 9.0f;
printf("n的值为:%d\n", n);
printf("*pf的值为:%f\n", *pf);
return 0;
}
请问一下代码输出结果是什么?
代码结果
为什么会输出以下结果呢?
很好奇是吧,这是因为浮点型的存储方式跟整型不一样。
3.1 浮点类型的存储
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1)s ∗ M ∗ 2E
🔻( (−1)^s)表示的是符号位,S=0,是正数。当S=1时,时负数。
🔻 M表示有效数字,M总是大于等于1小于2的。
🔻 **2E**表示指数位
例子
比如十进制的5.0,二进制表示位是101.0,相当于1.01×22
按照上面V的形式:可以得出S=0;M=1.01;E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×22 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
3.2 浮点类型的存储的过程
IEEE 754对有效数字M和指数E,还有⼀些特别规定。
有效数字M的存储过程
前面已经说过,M的取值 1≤M<2,M可以写成 1.xxxxxx的形式,其中xxxxxx是小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,比如前面M=1.01,只保存01,而当读取数据时,计算机会自动把1给添加回去。这样做的⽬ 的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。
指数E的存储过程
首先指数E是一个位无符号整数。如果E为8位,它的取值范围为0~255 ;如果E为11位,它的取值范围为0~2047。但是,我们知道科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,27的E是7,所以保存成32位浮点数时,必须保存成7+127=134,即1000 0110。
3.3 浮点类型的读取的过程
指数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)。
一开始的代码解析:
所以代码第6行输出的是0.000000。
再看看浮点数9.0,为什么整数打印是 1091567616 。
首先9.0的二进制可以写成1001.0,即换算成科学计数法是:1.001×2^3
得到S=0;M=1.001;E=3,所以: 9.0 = (−1) ∗ 0 (1.001) ∗ 23 。
以上就是本篇文章的全部内容,希望各位看官点点赞。