大端与小端

本博文为原创,转载请注明出处 http://blog.csdn.net/lux_veritas/article/details/8240948


大端与小端,是数据在机器上(确切的说是在进程的虚拟地址空间上)两种不同的存储方式。

熟知大多数的计算机以Byte(8个bit位)作为最小的可寻址的存储单元。但是8bit最多可以表示大小为256的无符号数值,远远达不到系统所需的计算需求。

于是就产生了字(word,一般为2Byte),双字(4Byte)等较大的数据运算单位,但是其在存储器上存储仍是以Byte为单位的。这种多字节构成的数据单位便产生了字节序的问题。

获得一个数据的步骤简化如下:1.通过寻址定位到数据在虚拟地址空间的位置,2.通过数据类型的定义获得数据相对于该位置的偏移,3.通过大端小端的判断最终确定数值

如图,该图显示0x01234567分别在小端和大端的机器上上的存储方式:



所谓小端,最低有效字节(LSB,Least Significant Byte)在低地址处,最高有效字节(MSB,Most Significant Byte)在高地址处

同理大端,最高有效字节(MSB,Most Significant Byte)在低地址处,最低有效字节(LSB,Least Significant Byte)在高地址处

需要说明的一点是,在绝大多数的机器上,多字节的数据都是连续存储的字节序列,而要访问该数据的地址为存储的最低地址(如图中,address的位置)


可以写个小程序,测试一下你的机器是大端还是小端。

#include <stdio.h>                                                                                                                       
                                                                                                                                         
int machine_is_little_endian()                                                                                                           
{                                                                                                                                        
    int data=0x01234567;                                                                                                                 
    char *p;                                                                                                                             
    p = (char *)&data;                                                                                                                   
    printf("p_add: %p\n",p);                                                                                                             
    printf("p_val: %x\n",(*p));                                                                                                          
    if((*p)==0x67)                                                                                                                       
        return 1;                                                                                                                        
    else                                                                                                                                 
        return 0;                                                                                                                        
}                                                                                                                                        
                                                                                                                                         
int main()                                                                                                                               
{                                                                                                                                        
    if(machine_is_little_endian() == 1)                                                                                                  
        printf("Little Endian Machine ...\n");                                                                                           
    else                                                                                                                                 
        printf("ca ...\n");                                                                                                              
                                                                                                                                         
    return 0;                                                                                                                            
} 

测试结果为:

[guohongwei@gc13:c_test]$ gcc -o play endian.c 
[guohongwei@gc13:c_test]$ ./play 
p_add: 0x7fff1c9db934
p_val: 67
Little Endian Machine ...
[guohongwei@gc13:c_test]$

笔者的机器为小端。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值