字节序:是由于CPU和OS对多字节变量的存储顺序不同而产生的
例如一个16位的整数,它由2个字节组成,有的操作系统会把高位字节放在内存的低地址上,有的操作系统会把高位字节放在内存的高地址上。
一般有2种表示:
- 小端字节序:在表示变量的内存地址的起始位置存放低字节,高字节顺序存放
- 大端字节序:在表示变量的内存地址的起始位置存放高字节,低字节顺序存放
例如变量:0xabcd,假设存放值0xabcd的内存地址的起始地址为0
- ——小端字节序:0xab在地址15~8的位置上,0xcd在地址7~0的位置上
- ——小端字节序:0xab在地址7~0的位置上,0xcd在地址15~8的位置上
写出一个程序,判断系统字节序类型
#include <stdio.h>
/* 联合类型的变量类型,用于测试字节序
* 成员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
作者的系统为小端字节序存储
网友评论