什么是little-endian和big-endian,如何用程序判断

本文解释了Big-endian和Little-endian的概念及其在不同CPU架构中的应用。通过实例展示了两者如何存储数据,并介绍了判断当前系统使用哪种字节序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是little-endian and big-endian?这个涉及到CPU两大派系的问题,IBM的CPU,多数RISC的cpu,和MOTO的微处理器采用的是big-endian,Intel的x86系列都是采用little-endian,而ARM同时支持 biglittle,实际应用中通常使用little endian。。。所以我们使用的大多数PC都是little-endian了。他们具体的区别何在呢,big-endian是指一个WORD里面的高位BYTE存放在内存中这个WORD区域的低地址处,而little-endian则相反,即一个WORD里面的高位BYTE存放在内存中这个WORD区域的高地址处。这里举个简单的例子,比如存放0x12345678到这两种的CPU当中,内存地址假定从0x0000开始,存放顺序如下:
内存地址              big-endian:            little-endian
0x0000                  0x12                 0x78         
0x0001                  0x34                 0x56                          
0x0002                  0x56                 0x34
0x0003                  0x78                 0x12
可以看出big-endian比较符合人们的思维习惯,而little-endian则。。。。
其实
big-endian:little-endian还与网络和java虚拟机有关,因为在网络和java中都是用的big-endian来存放数据,网络字节序其实就是big-endian,所以才会出现htons()此类的函数,这个函数怎么写,如果用宏又怎么写?ntohs呢?atoi呢?汗,怎么突然想到atoi
用宏来写一个吧
#define htons(a)  ((a)&0x00ff)<<8)|
((a)&0xff00)>>8)
然后是怎么写个程序来判断是little or big
首先这个函数用一个int类型来返回吧,1为little 0为big,-1为error
具体实现的时候采用一个union来放一个unsigned short和两个char的数组,然后取这个ushort是0x0001
int LOrB(){
    union {
         unsigned short us;
         unsigned char uc[2];
    }un;
    un.us=0x0001;
    if(un.uc[0]==1)
        return 1;
    else if(un.uc[0]==0)
        return 0;
    else return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值