字节序

字节序:是由于CPU和OS对多字节变量的存储顺序不同而产生的

例如一个16位的整数,它由2个字节组成,有的操作系统会把高位字节放在内存的低地址上,有的操作系统会把高位字节放在内存的高地址上。

一般有2种表示:

  • 小端字节序:在表示变量的内存地址的起始位置存放低字节,高字节顺序存放
  • 大端字节序:在表示变量的内存地址的起始位置存放高字节,低字节顺序存放

例如变量:0xabcd,假设存放值0xabcd的内存地址的起始地址为0

  • ——小端字节序:0xab在地址15~8的位置上,0xcd在地址7~0的位置上
  • ——小端字节序:0xab在地址7~0的位置上,0xcd在地址15~8的位置上

写出一个程序,判断系统字节序类型

#include 

/* 联合类型的变量类型,用于测试字节序
 * 成员value的高低端字节可以由成员type按字节访问
 */
typedef union{
        unsigned short int value;                                                               /*短整型变量*/
        unsigned char byte[2];                                                          /*字符类型*/
}to;

int main(int argc, char *argv)
{    
        to typeorder ;                                                                          /*一个to类型变量*/
        typeorder.value = 0xabcd;                                                               /* 将typeorder变量赋值为0xabcd */
    
        /* 小端字节序检查 */
        if(typeorder.byte[0] == 0xcd && typeorder.byte[1]==0xab){               /*低字节在前*/
                printf("Low endian byte order"
                                "byte[0]:0x%x,byte[1]:0x%x\n",
                                typeorder.byte[0],
                                typeorder.byte[1]);    
        }
    
        /* 大端字节序检查 */
        if(typeorder.byte[0] == 0xab && typeorder.byte[1]==0xcd){               /*高字节在前*/
                printf("High endian byte order"
                                "byte[0]:0x%x,byte[1]:0x%x\n",
                                typeorder.byte[0],
                                typeorder.byte[1]);    
        }
    
        return 0;    
}

运行结果

wangande@wangande-MS-7808:~/workspace/Linux-net/source/08$ gcc check_order.c -o check_order
wangande@wangande-MS-7808:~/workspace/Linux-net/source/08$ ./check_order 
Low endian byte orderbyte[0]:0xcd,byte[1]:0xab

作者的系统为小端字节序存储

你可能感兴趣的:(字节序)