数据在内存中的存储方式

大端存储和小端存储

超过一个字节的数据在内存中存储时,会按一定顺序存储,按不同的存储顺序可分为大端存储和小端存储。

大端存储

大端存储:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存
在内存的低地址处。

小端存储

是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存
在内存的⾼地址处。

下面这张图片是a在小端存储的计算机中显示的。可以发现是按字节顺序倒序存放的。

注:一个字节等于八个比特位,一个十六进制数等于四个比特位,所以两个十六进制数为一个比特位,这里按字节倒序,不是将每一个二进制数倒序存放。这里用10举例。

大端字节序按按正常书写顺序相同,这里因没有大端存储的计算机无法举例。

那么如何写一个程序知道数据在内存中的存储方式呢?
代码示例:

int main()
{
	int a = 1;
	int b = *(char*)&a;
	printf("%d", b);
	return 0;
}

这里是通过修改指针的类型取出a中的某一范围,得出是否是大端还是小端存储。

还有一种用union类型得出结果,这里可以尝试书写。

各种类型的范围以及溢出的问题

各种类型的范围

这里只列举范围不过多解释

注:char类型的范围由编译器决定,可能是unsigned char 或者 signed char,这里是vs下的范围。

上面是各种类型的范围,以及在不同环境下,类型的范围可能存在差异,可以查找编译环境下的limit文档进行查看。

那么知道了范围,就要考虑溢出问题了。

溢出问题解释

只要是存储的数据就一定有范围,计算机不可能表示无穷大量,所以如果出现超过范围的值那么计算机会怎么处理呢。

在vs中,编译器会将溢出值截断,只留下在范围内的二进制位。例如:int类型有四个字节,三十二个二进制位,那么计算机会将第三十三位截断,剩下的就是存储的内容。

这里只是部分介绍,想了解更多需要学习计算机底层寄存器溢出问题。

那么溢出会导致什么问题呢。常见的有死循环,输出值错误等问题。为避免这些问题就需要使用者确定程序输入范围了。

数据的存储方式

一般类型的存储方式

数据在内存中基本以二进制补码的形式存储。对于有符号数而言最高位表示符号位,0表示正,1表示负。

其他位表示有效值为多少。所以有符号数相对于无符号数在范围上小一些,但是由于符号,有符号数在负数区间又补了回来。两者表示数量相同,没有导致缺失,这就是利用补码存储的优点。

注:正二进制数的补码、反码、原码相同。负二进制数的补码是反码加一,反码是原码取反。这里不过多介绍,需要可以在b站找相关视频学习。

float类型和double类型的存储方式

根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1)^s * M ∗ 2^E 
• (-1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是大于等于1,小于2的
• 2^E 表示指数位

拿float类型举例

10.5 这个数先转化为二进制数为 1010.1 在按上述存储 s为0,m为1.0101,e是3;

上面是float类型的存储范围分配

在存储中s按求得s存储,e需要+127(这里是避免出现e小于零的情况,导致使用符号位多占用表示的范围),m则保留小数位,从左到右顺序存储。

拿上面举例 S为0,E = e+127 = 130 = 10000010,M为0101。

所以在内存中10.5是0100 0001 0010 1000 0000 0000 0000 0000.由于平时电脑一般为小端存储所以内存中存储顺序应该是0000 0000 0000 0000 0010 1000 0100 0001 -> 00002841(电脑一般按十六进制表示)

double类型也是类似,不过是E = e + 1023以及精度更高了

这里还有两种特殊情况E全为零和E全为1。

全为零则表示无穷小,全为一则表示无穷大。

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值