大小端字节序的判断

最近要重新研究linux网络编程,首先都遇到这个问题,记录复习下吧~
本文转自:http://blog.chinaunix.net/uid-23069658-id-3271110.html

大小端字节序
小端字节序:little-endian,将低字节存放在内存的起始地址;
大端字节序:big-endian,将高字节存放在内存的起始地址。
例如,数字index=0x11223344,在大小端字节序方式下其存储形式为:

这里写图片描述

上图一目了然的可以看出大小端字节序的区别。

程序实现

#include <stdio.h>
#include <stdlib.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

int main()
{
    printf("short int=%d,char=%d\r\n",sizeof(short int),sizeof(char));
    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);
    if(x1 ==0x22)
    {
       //小端字节序:little-endian,将低字节存放在内存的起始地址;
       //大部分电脑都是小端模式 
       printf("小端字节序\n");   
    }else
    {  //大端字节序:big-endian,将高字节存放在内存的起始地址。 
        printf("大端字节序\n");
    }
    system("pause");
    return 0;
}

在windows 32位编译器上,编译结果:

short int=2,char=1
x1=22
x2=11
小端字节序


总结:
网络字节顺序采用big endian方式。
X86系列CPU都是小端little-endian字节序,即低字节存低位,高字节存高位。

补充:
参考《Unix环境编程》,在windows和ubuntu环境下大小端识别均为小端模式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    union{
        short s;
        char c[sizeof(short)];
    }un;

    un.s = 0x0102;

    if( sizeof(short) == 2)
    {
        if(un.c[0] == 1 && un.c[1]== 2)   //将低序字节存储在起始地址,为小端字节序 
            printf("big-endian\n");
        else if(un.c[0] == 2 && un.c[1]== 1) //将高序字节地址存储在起始地址,成为大端字节序 
            printf("little-endian\n");
    }
    else
    {
        printf("sizeof(short)= %d\n",sizeof(short)); 
    }



    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值