这周在上互联网络程序设计课程的时候老师提到了字节序的概念,之前也听说过,但印象不深,所以记录下来加深印象。
首先计算机通常是以字节来表示和存储数据,那么占两个字节以上的数据在内存中应该如何排列呢? 这就引出了大端字节序和小端字节序。
例如一个16进制数0x1234,占2个字节,如果内存低地址存数据高字节,那么这种存储方式就被称为大端字节序。如果内存低地址存数据高字节,这种存储方式被称为大端字节序。
我们可以用C语言中的联合体来测试自己的机器是大端字节序还是小端字节序。联合体中数据的起始地址是相同的。因此我们可以访问到内存低地址的内容。
#include <stdio.h>
int main() {
union u{
char ch;
short s;
}u0;
printf("size of char is %d byte\n",sizeof(char));
printf("size of short is %d byte\n",sizeof(short));
u0.s = 0x1234;
if(u0.ch==0x34){
printf("Little-endian");
}else{
printf("Big-endian");
}
return 0;
}
在我的电脑上输出是 Little-endian, 即小端字节序。
而网络字节序是指按大端字节序进行数据传输。