【Endian】C语言的大小端及其简单的判断。

                           Endian ,即我们说的端模式,最开始这个词出自于《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。

                在计算机业界,Endian 表示数据在存储器中的存放顺序(采用大小端模式对数据进行存放的主要区别在于存放的字节顺序)。 ↓↓↓

    

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。(注:OP0表示一个32位数据的最高字节MSB;OP3表示一个32位数据最低字节LSB

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。

地址偏移

大端模式

小端模式

0x00

12(OP0)

34(OP1)

0x01

34(OP1)

12(OP0)



通过上面的两个表我们可以看出:大端方式将高位存放在低地址这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;小端方式将高位存放在高地址这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。


下面通过两段代码更直观的分析一下大小端的问题

1、判断大小端的简单方法

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     unsigned int i = 1;  
  7.     if(*((char*)&i) == 0)  
  8.     {  
  9.         printf("this is big endian. \n");  
  10.     }  
  11.     else if(*((char*)&i) == 1)  
  12.     {  
  13.         printf(" this is little endian. \n");  
  14.     }   
  15.     else  
  16.     {  
  17.         printf("sorry, i do not know . \n");  
  18.     }  
  19.     return 0;  
  20. }  





#include <stdio.h>
int main()
{
    short int x;
    char x1,x2;
    x = 0x1122;
    x1 = ((char *)&x)[0];    //低地址
    x2 = ((char *)&x)[1];    //高地址
    printf("x1=%x\n",x1);
    printf("x2=%x\n",x2);
    return 0;
}


证明系统为小端模式

后续更深入的学习后,我将会修改补充。
作为一个初学者,我将会不断的努力! 谢谢路过的你们❤

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值