字节序:大端字节序(Big Endian) & 小端字节序(Little Endian)
一、什么是字节序?
多字节数据存储在存储器中的顺序就叫做字节序。字节序又分为俩种,一种叫做小端字节序;另外一种叫做大端字节序。
二、大端字节序(Big Endian)& 小端字节序(Little Endian)
大端字节序:在大端字节序的机器中,首先会存储多字节数据类型的二进制表示的第一个字节;
小端字节序:在小端字节序的机器中,首先会存储多字节数据类型的二进制表示的最后一个字节;
我们用32位机器存储int型变量0x12345678为例
简单的总结大小端存储方式:
- Big Endian 是指低地址端 存放 高位字节。
- Little Endian 是指低地址端 存放 低位字节。
三、用代码实现查看大小端
#include <stdio.h>
#include <stdlib.h>
void show_mem_rep(char *start, int n){
int i;
for (i = 0; i < n; i++){
printf("%.2x ", start[i]);
}
printf("\n");
}
int main(){
int i = 0x12345678;
show_mem_rep((char*)&i, sizeof(i));
system("pause");
return 0;
}
我们预测一下会发生输出结果:
大端机器输出:12 34 56 78
小端机器输出:78 56 34 12
运行结果:
从运行结果看,本地机器为小端机器。
有没有快速的方法来确定您的机器的字节顺序?
#include <stdio.h>
#include <stdlib.h>
int main(){
unsigned int i = 1;
char *c = (char*)&i;
if (*c) //如果*c为1,那么就为小端
printf("这是小端序\n");
else //*c为0,为大端
printf("这是大端序\n");
system("pause");
return 0;
}
代码解读: 在上面的程序中,字符指针c指向整数i。由于字符指针被解引用时字符的大小为1字节,因此它将仅包含整数的第一个字节。如果机器是小端,则* c将为1(因为最后一个字节存储在第一个),如果机器是大端,那么* c将为0.
四、字节序重要吗?
在网络编程中: (在网络中,网络传输以大端字节序为标准,所以在网络传输中都会先将数据转换为大端,接着再传输,所以显得尤为重要在这里) 假设我们在一个小端机器上写入整数文件并将此文件传输到大端机器,除非我人为的对大端机器做具有转换小端字节序的功能,否则大端机器将以相反的顺序读取文件。 (待续~~~)