数据在内存中的存储

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的储存有两种特殊情况:

  1. E全为0
    这时,浮点数E相当于一个很小的数-127或者-1023,当S=0,说明浮点数是正数,并且将无线从右边趋近于0,当S=1,说明浮点数是负数,斌且将从左边无线趋近于0.

    此时在这区间里浮点数默认为0,所以在程序中不能出现浮点数直接与0进行比较,而是用宏定义极限值,在这区间里,浮点数为0.

  2. E全为1
    这时的E是一个很大的数值,当M不全为0的情况下,当S=0时,表示浮点数的最大取值,当S=1时,表示浮点数的最小取值。当M全为0时,表示正负无穷大。

以上是关于数据在内存中的存储的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

C程序存储结构

viewpager 中的 3 个 android 片段,如何让它们全部存活?

JDK常用数据结构

C语言进阶——数据在内存中的存储

C语言进阶——数据在内存中的存储