数据在内存中的存储
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据在内存中的存储相关的知识,希望对你有一定的参考价值。
一.整形数据在内存中的存储。
整形数据在内存中的存储是以二进制的形式,并且是以补码的形式进行存储的!
1.原码,反码,补码
计算机有符号数有三种表示方式,即原码,反码和补码。三种表示方式均有符号位和数值位组成,符号位用‘0’表示正,用‘1’表示负。
原码:直接将二进制按照正负数的形式翻译成二进制。
反码:将原码的符号位不变,其它依次取反。
补码:反码进行加1。
举个例子:整形int -10的二进制序列为1000 0000 0000 0000 0000 0000 0000 1010
原码为:1000 0000 0000 0000 0000 0000 0000 1010
反码为:1111 1111 1111 1111 1111 1111 1111 0101
补码为:1111 1111 1111 1111 1111 1111 1111 0110
2.数据在内存中的存取
- 数据在内存中存储
数据在内存中存的时候,决定开辟多大的空间,负数将原码转成补码,正数补码就是原码。不需要看类型是否是有符号数还是无符号数。
- 数据在内存中取出
整形数据在内存中取出时,决定看待方式,看要以有符号数还是无符号数取出,如果以有符号数取出,最高位为1,要将数据转为原码,如果最高位为0,不需要转化,直接输出。如果是无符号数,直接将存储的二进制输出,不需要转化。
用一个例子说明:
#include<stdio.h>
int main()
{
signed int a = -1;
unsigned int b = -1;
printf("a=%d,b=%d\\n", a,b);
printf("a=%u,b=%u\\n", a, b);
return 0;
}
输出:
解释:容易知道-1的补码是1111 1111 1111 1111 1111 1111 1111 1111 不管是有符号数还是无符号数在内存中-1都是这样保存的。当输出以有符号数(%d)输出时,会将-1储存的补码形式转化为原码1000 0000 0000 0000 0000 0000 0000 0001,即输出-1。当输出以无符号数(%u)输出时,不需要将存储的二进制序列转化。直接输出即输出4294967295。
注意:
1.正数的原,反,补码相同,都是原码。
2.整形数据做计算时,是补码进行计算,不需要看类型。然后看输出是有符号数还是无符号数,确定是否需要转化。
二.大小端介绍
1.什么是大端小端
大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
以一个16进制数为例int a=0x11223344;
小端储存模式
大端储存模式
2.为什么有大端小端
在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8比特位。但是在C语言中除了8比特位的char之外,还有16比特位的short型,32比特位的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
三.浮点数在内存中的存储。
根据国际标准IEE(电气和电子工程协会)754,说明任意一个浮点数可以表示成下面的形式:
(-1)^S*M*2^E
- (-1)^S表示符号位,当S=0,表示正数,当S=1,表示负数。
- M表示有效数字,数值大于等于1,小于2。
- 2^E表示指数位。E为无符号整数
浮点数在储存时是将S,M,E储存在内存中。但是还有一些规定,举个例子来说明:
十进制的-5.0,写成二进制-101.0,相当于-1.01*2^2。根据上面的格式得出,S= 1,M=1.01,E=2。
IEEE754规定:
对于32位浮点数,最高位的1位为符号位S,接下来的8位是指数E,剩下的23位为有效数字M。
如图:
对于64位的浮点数最高的1位为符号位S,接下来11位是指数E,剩下的52位为有效数字M。
排布与32位相同,只是位数多了。
- S的存放是0存0,是1存1。
- 由于E是一个无符号整数,如果E为8位,它的取值范围为0~255,如果E位11位它的取值范围为0 ~2047。但是我们知道科学计数法是可能出现负数的,所以规定,存入内存的E必须加一个中间值,对于8位的E,中间值为127,对于11的E,这个中间值为1023,然后转为二进制储存。取出时将二进制转为十进制再减中间值。
- M的存放,已知M的取值大于等于1,小于2,也就相当于是1.xxxx,在存储时计算机会自动将前面的1.去掉,将后面的数从左到右储存,位数不够补0。
E的储存有两种特殊情况:
-
E全为0
这时,浮点数E相当于一个很小的数-127或者-1023,当S=0,说明浮点数是正数,并且将无线从右边趋近于0,当S=1,说明浮点数是负数,斌且将从左边无线趋近于0.此时在这区间里浮点数默认为0,所以在程序中不能出现浮点数直接与0进行比较,而是用宏定义极限值,在这区间里,浮点数为0.
-
E全为1
这时的E是一个很大的数值,当M不全为0的情况下,当S=0时,表示浮点数的最大取值,当S=1时,表示浮点数的最小取值。当M全为0时,表示正负无穷大。
以上是关于数据在内存中的存储的主要内容,如果未能解决你的问题,请参考以下文章