详解C语言判断系统的大小端问题

今天突然就想到,之前在面试时被问到的一个问题,如何判断计算机的大小端,先来说一下什么是大小端吧,其概念如下:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。 ——from百度百科

看完上面的描述,大家可能会觉得还是小端模式比较合乎常理是不是,毕竟高位数据存高位,低位数据存低位,再正常不过了,可是大端模式在实际生产环境中也是很常见的,比如说网络中的传输报文,就是典型的大端传输,这里我们不去赘述

实际上本篇文章的重心在于如何判断大小端,比较简单的一个例子如下:

/*
Funcion-name:IsLitte_Endian
Funcion-In:none
Funcion-Out: true-litte, false-bigger
*/
bool IsLitte_Endian() {
    int iTestValue = 0x12345678;
    short *sTestValue = (short*)&iTestValue;
    return !(0x1234 == sTestValue[0]);
}
int main() {
    cout<<IsLitte_Endian()<<endl;
    return 0;
}

此时在main函数中打印出的应该就是1,也就是当前系统采用的是小端存储

相信这个时候你看的也是一头雾水,不用着急,我们细细道来,首先要明确的基础知识:
iTestValue变量的类型为int,int一般占32bit,也就是4字节(sizeof(iTestValue))的空间,而我们为其赋值也是赋予16进制的0X12345678,对于16进制的数,每两位就相当于一个自己,也就是在iTestValue占用的这四个字节内,其内存分布是这样的:
第1个字节:0X12
第2个字节:0X34
第3个字节:0X56
第4个字节:0X78

sTestValue是我们另外的一个short类型指针,short类型的占16bit,也就是2字节,那么此时我们将iTestValue的地址赋给sTestValue,相当于把32bit的东西指向到一个16bit的变量,是不是觉得存不下啊?实际上不是的,别忘了指针是可以偏移的,就和数组一样,一个16bit存不下,我再偏移16bit不就存下了,所以这个时候sTestValue的存储结构就是:
sTestValue[x]:0X1234
sTestValue[y]:0X5678
这里的x与y满足 |x - y| = 1,且一个为0一个为1
那么问题来了,纠结x与y那个为0,那个为1呢,这就是我们要研究的终极问题,大小端存储,如果是小端存储,那么对于sTestValue的低位,也就是sTestValue[0],就应该存储低位数据,也就是0X1234,否则就去存储0X5678,这就是我们这个判断的意义:

return !(0x1234 == sTestValue[0]);

所以,我们还可以写另外一个判断:

Funcion-name:IsLitte_Endian
Funcion-In:none
Funcion-Out: true-litte, false-bigger
*/
bool IsLitte_Endian() {
    int iTestValue = 0x12345678;
    short *sTestValue = (short*)&iTestValue;
    return !(0x5678 == sTestValue[1]);
}

此时输出值也为1,从而证明我们的论述是正确的,现在就可以很明确的写出sTestValue的存储格式:
sTestValue[0]:0X1234
sTestValue[1]:0X5678
如果是大端存储,那么其存储方式就是:
sTestValue[1]:0X1234
sTestValue[0]:0X5678

怎么样,是不是大小端的判断还是很有趣的,赶紧行动起来,自己动手写写看吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值