大小端

有时候,我们需要知道我们的环境是大端(Big-Endian)还是小端(little-Endian)。 
具体什么是大端什么是小端,我们暂时不讨论,也不下定义,先看怎么用?为什么要有大小端?


    我们知道数据的存放是以字节为单位的,字节就是8bit位,也就是我们看到的8个2进制,可以说是一个地址存放一个单独的数据,不存在大小端的问题。


    16bit的机器诞生后,数据的存放也是按照字节为单位的,也是8bit位,这时候的问题就来了,过去8bit机器是一个地址一个字节,现在一个地址可以存放2个字节的数据了,其中该地址又分为高8位和低8位,2个字节怎么分配到高8和低8,这是一个选择题。于是2中流派就产生了,数据的逻辑低存到低8,逻辑高存到高8;或者是数据的逻辑低存到高8,逻辑高存到低8.用具体的数据解释也就是这样的。
有一个数据0x1234,其中34是逻辑低位,12是逻辑高位,这个数据要存放到内存地址0x00和0x01处,0x00是低地址(低8位),0x01是高地址(高8位),于是2种存放方式如下:
0x01 12 
0x02 34 
 或者 
0x01 34 
0x02 12 
于是乎,我们为了区分这2中类型,我们就给他们命名为大端和小端,当然这个名字无所谓,只要我们知道他们的存储方式就可以了。
    既然知道了他们的存储方式,那么我们怎么判断当前的环境的数据存放模式就很简单了。只要判断低8位的数据是否等于逻辑低位的数据,或者判断低8位的数据是否等于逻辑高位的数据,等等,可以选择你自己的比较方式,以上就是原理和出处。下面说一下具体怎么用语言来判断。
    这里用C做示范,当然我们最先想到的是用强大的C指针和处理地址的能力,获得他们的低8位的数据然后跟逻辑位进行比较,代码如下
int cpu_check_1() 
{ 
    int x = 0x1234; 
    char x0,x1; 


    x0 = ((char*)&x)[0];//这是低8位 
    x1 = ((char*)&x)[1];//这是高8位 


    if(x0 == 12 && x1 == 34)//如果低8位的数据等于逻辑高位的数据,高8等于逻辑低->大端 
        return 1;// big-endian 
    else 
        return 0;//little-endian 
} 
还有的同学对C的union很有研究,完全可以用union判断,代码如下:
int cpu_check_2() 
{ 
    union 
    { 
        int a; 
        char b; 
    }un; 


    un.a = 0x1234; 


    if(0x34 == un.b) 
        return 0; //little-endian 
    else 
        return 1; //big-endian 
} 
当然还可以使用强制转换来判断,代码如下:
int cpu_check_3() 
{ 
    int a = 0x1234; 
    char b = a; 


    if(34  == b) 
        return 1;//little-endian 
    else 
        return 0;//big-endian 
} 
最后,这种判断的方法有很多种,夸张的说数不胜数,但是原理都是一个,概念记住与否无所谓,原理懂了就行了,分析问题的方法掌握了就可以了,以上讨论的是16位机器的大小端,当然32位,64位,128位都是同一个原理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值