请问什么是大端小端以及如何判断大端小端
| 字节地址(序号) 低->高 | 0 | 1 | 2 | 3 |
| 大端 | 12 | 34 | 56 | 78 |
| 小端 | 78 | 56 | 34 | 12 |
typedef union {
uint16_t v;
uint8_t bytes[2]; // bytes[0] 是小地址,bytes[1]是大地址:w
}u16;
/* 方法1: 判断主机序是否为大端
* 利用联合体, 对2byte 联合体赋值后, 分别检查高低地址字节数据是否为大端特征
* */
void isBigEnding() {
u16 a;
a.v = 0x1234;
if (a.bytes[0] == 0x12 && a.bytes[1] == 0x34) {
printf("big ending\n");
}
else if (a.bytes[0] == 0x34 && a.bytes[1] == 0x12) {
printf("little ending\n");
}
else {
printf("error value");
}
return;
}
#include <arpa/inet.h>
/* 方法2: 判断是否为大端
* 利用已知的网络序为大端, 而htons是将2byte主机序数据转换成网络序, 判断转换前后是否有变化
* 如果没变化, 则说明为大端; 如果有, 则说明为小端
* */
void isBigEnding2() {
uint16_t hport = 0x8000;
uint16_t nport = htons(hport); // 网络字节序是大端
printf("number in net byte order is 0x%x\n", nport );
if (hport == nport) {
printf("big ending\n");
}
else {
printf("little ending\n");
}
}
/* 写一个程序判断所使用系统的字节序 */
int main() {
isBigEnding();
isBigEnding2();
return 0;
} unsigned int small = 0xAABBCCDD;
unsigned char *big = &small;
printf("small:%x big = %x ",small,*(++big)); 看下最后的结果是0xCC还是0xBB,如果是0xBB,则是大端序,如果是0xCC,则是小端序。