探索C语言:数据存储方式——大小端字节序

大小端字节序和字节序判断

计算机硬件有两种存储数据的方式:

  • 大端字节序——Big Endian

  • 小端字节序——Little Endian

字节序,就是计算机存储多字节数据的方式。

1、大小端字节序名字来源

关于“ little endian(小端)”和“ big endian(大端)”的由来,网传有一个有趣的故事,可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。
《格利佛游记》:“Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因是:我们都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可是那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,由此发生了多次叛乱,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的。叛乱平息后,流亡的人就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。”


2、什么是大小端

  • 大端(存储)模式:是指数据的低位保存在内存的高位地址中,而数据的高位保存在内存的低地址中
  • 小端(储存)模式:是指数据的低位保存在内存的低位地址中,而数据的高位保存在内存的高地址中

在这里插入图片描述

🤔不懂?请看下图解析

int i = 1;

在这里插入图片描述

在64位的平台中,找到i 的地址为:0x00000E810BDF454,内存中存放着01 00 00 00。有没有发现它是倒着存的,这其实就是小端存储。

🎇小端存储

判断大小端是以字节来看的,如16进制数0x11223344,则11相对于其它是高位,就好比十进制123,1是百位,2是十位,3是个位,则1相对于2、3,为高位,请看下面的图解。
在这里插入图片描述

大小端是由底层硬件决定的,那怎样看是不是小端?

  • 一句话——>“低 低 ->为小”

数据的低位放在内存的低位,则为小端。一般我们去内存中查看数据时,小端一般是倒着存放的,如下图

在这里插入图片描述


🎆大端存储

大端:将数据的低位保存在内存的高位地址中,而数据的高位保存在内存的低地址中。
在这里插入图片描述


3、大厂笔试题实战

设计一个小程序来判断当前机器的 字节序。

解法思路:

  • 判断该机器为大小端存储模式,既需要判断存进去一个数据存储的顺序为数据本身顺序还是逆顺序。
  • 如创建一个变量i:int i = 1,看它存进去的是00 00 00 01还是01 00 00 00,再进一步想,只需要判断最低位为00还是01,就可以判断大小端了。我们可以利用强制类型转换,让char*来得到这个第一位的数值,再判断是0还1后输出即可。

解题代码:
在这里插入图片描述


4、总结:

大小端的存储方式,简单点说就是硬件厂商各有所好,并没有统一的约定制作制作哪一个,大端的优势在于第一个字节就是高位,很容易判断正负性。小端的优势在于第一个字节是低位,最后一个字节是高位,可以依次取出相应的字节进行运算,并且最终会把符号位刷新,这样运算起来更高效。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白菜不空心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值