[转]字节序与位序的统一性

来源: http://blog.sohu.com/people/lemmo82/178791801.html

字节序与位序切实是统一的;

 

依据计算机设计的架构形式不同,等闲CPU(和一些外设)判别为大端序和小端序,另外也有所谓混杂序的装备存在,这种装备在这里不做琢磨

 

所谓大端序,即便当机器沿着地址从低地址向高地址读的时候,第一个读取到的字节byte或位bit

 

都是从最高的一位(MSBMost Significant Bit,最高管用位)或最高的一个byte

 

(本文所描写内容均不琢磨补码导致的切实存储数据改变)

 

如下所示

 

地址低位————>地址增长方向 ————>地址高位

 

  数据高位 | 1 0 0 0 1 1 1 1 | 0 1 0 1 0 0 0 0 | 数据低位

 

                byte 1                 byte 2

 

              |

 

             /|/

 

              pointer

 

指针指在第一个bit处,当 读取的时候顺次读入1000111101010000 (顺次读入 0x8f, 0x50)这个16位的数即便0x8f50

 

 

 

而低端序对应的16位数0x8f50 的存储措施为:

 

地址低位————>地址增长方向 ————>地址高位

 

数据低位  | 0 0 0 0 1 0 1 0 | 1 1 1 1 0 0 0 1| 数据高位

 

                byte 1                 byte 2

 

              |

 

             /|/

 

              pointer

 

读取的时候顺次读入0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1;

 

 

 

从上能够看出从大端序到小端序,发生了两个改变:

 

1、字节序列编排措施的改变 ;高低互换;

 

2、位序发生了改变,高低互换;

 

测验过程如下:

 

 

#include <stdlib.h>

#include <stdio.h>

 

int main ()

{

    int a = 0x12345678;

    char *pos = (char *) &a;

    printf("sizeof int : %d/r/n", sizeof(int));

 

    int i = 0;

    while (i < sizeof(int))

         {

        printf("%x - %x ", pos, *pos);

        i++;

        pos++;

    }

}

 

 

 

 

小端序机器上运行收获(x86):

 

sizeof int : 4

bfcfd470 - 78 bfcfd471 - 56 bfcfd472 - 34 bfcfd473 – 12

 

地址是添置的,输出时从第四字节(起码)到第一字节(最高)

 

 

 

大端序机器上运行收获(powerpc 51xx):

 

sizeof int : 4

2ff22c30 - 12 2ff22c31 - 34 2ff22c32 - 56 2ff22c33 - 78

 

 

 

另字节序和位序的联系是很紧凑的;参见关于网络协议中IP头部的数据构造定义

 

 

 

typedef struct _ip

{

 

         #if BYTE_ORDER == LITTLE_ENDIAN

 

                            uchar   ip_hl:4,               

                                    ip_v:4;                

 

         #endif

 

         #if BYTE_ORDER == BIG_ENDIAN

 

                            uchar   ip_v:4,                 

                                    ip_hl:4;               

 

         #endif

 

                            uchar   ip_tos;                

                            ushort  ip_len;                

                            ushort  ip_id;                 

                            ushort  ip_off;                

 

         #define IP_DF 0x4000                   

 

         #define IP_MF 0x2000                   

 

         #define IP_OFFMASK 0x1fff              

                            uchar   ip_ttl;                

                            uchar   ip_p;                  

                            ushort  ip_sum;                

                            IPADDRTYPE ip_src;             

                            IPADDRTYPE ip_dst;             

 

}IP;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值