大小端问题

大小端问题

参考博文https://blog.csdn.net/ce123_zhouwei/article/details/6971544

看了好久的大小端问题,今天终于算是理解了。

定义:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举例:
数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 —————–> 高地址
0x12 | 0x34 | 0x56 | 0x78

2)小端模式:
低地址 ——————> 高地址
0x78 | 0x56 | 0x34 | 0x12
因为计算机是按字节存储,故对于16进制数来说,每两位一个字节,捆绑在一起。

这里主要理解两件事:所谓的如何存储是计算机的事情,而存取的数字如何定义是我们的事。比如数字123,1表示1百,2表示20,3就是3,故对我们来说,最高位最大,最低位最小。0x12345678在我们看来就是12最大,34其次…78最小。那么计算机如何存呢。如果是小端,对我们而言小的数也就是78,就放在内存的低地址处,依次内推。大端的话,对我们来说大的数,就放在最低。

就像告诉你一个在内存中按大端模式存储如下的数:
低地址 —————–> 高地址
0x12 | 0x34 | 0x56 | 0x78
问你,该数实际表示的是多少?
这时候我们就要想想了,哦,大端,那么低位是存的是我们觉得最大的数字,高位存的是最小的数字。这样一拼就是0x12345678

再举个例子
char a[4] = {2,1,3,7};
则在小端模式下下面的c是多少?
short c = * ((short *)a);
解答:
内存存储:
低地址 —————–> 高地址
0x02 | 0x01 | 0x03 | 0x07
取两个字节是0x02和0x01。这样的话怎么组合呢。想想刚刚我们的话,对我们而言放在高地址(0x01)的就是高位的数,低地址(0x02)的是低位的数。故组合在一起就是0x0102,即c = 255。

如何测试大小端机呢?
union
{
short b;
char a[2];
}u;
u.b = 0x0102;
if(u.a[0] == 0x02)
printf(“litter endian”);
else if(u.a[1] == 0x02)
printf(“big endian”);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值