大端、小端及其判定

小端(little-endian) 

机器易于处理的字节序 
地址低位存储值的低位 

地址高位存储值的高位 


大端(big-endian) 

最直观的字节序 
地址低位存储值的高位 
地址高位存储值的低位
 


说的是CPU处理数据的方式。可用C语言中的联合体union来判定当前机器的字节序,因为union是由地址低位开始分配变量的。

#include <stdio.h>

int main()
{
    union u{
        int a;
        char b;
    }c;
	c.a = 0x1234;
	printf("0x%x", c.b);
}


个人机器输出“0x34”,为小端。若设变量地址为0000,内存分布如下

-------------------------------------------------

地址    0000    0001    0002    0003

u       0x34    0x12    0x00    0x00

u.a     0x34    0x12    0x00    0x00

u.b     0x34
-------------------------------------------------

其实,X86平台的处理器均为小端,而PowePC处理器多为大端。

PowerPC处理器多用于网络,故网络间编程时常常用到:

ntohs(n) htons(n) ntohl(n) htonl(n),来处理网络及主机间16位、32位数据的转换

大端处理器到网络是不需转换的,而小端处理器到网络需要转换,其实质 ntohs(n) = __swab16(n),ntohl = __swab32(n)

#define ___swab16(x)
{
            __u16 __x = (x);
            ((__u16)(
                        (((__u16)(__x) & (__u16)0x00ffU) << 8) |
                        (((__u16)(__x) & (__u16)0xff00U) >> 8) ));
}

#define ___swab32(x)
{
            __u32 __x = (x);
            ((__u32)(
                        (((__u32)(__x) & (__u32)0x000000ffUL) << 24) |
                        (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |
                        (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |
                        (((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值