1、概念
所谓大端小端,指的是对于多字节的数据类型(比如,int)在内存中存放的字节顺序。小端是指低地址的字节存放的是数据的低位,高地址字节存放的是数据的高位。大端是指低地址字节存放的是数据的高位,高地址字节存放数据的高位。简单地说,低位字节存放数据的高位就是大端,低位就是小端。
下面是一个例子,用来说明整数0x12345678在大端小端模式下不同的存放顺序。
内存地址 | 小端模式 | 大端模式 |
0x5250 | 0x78 | 0x12 |
0x5251 | 0x56 | 0x34 |
0x5252 | 0x34 | 0x56 |
0x5253 | 0x12 | 0x78 |
你可能会想,我是不是搞错了。但的确没错,因为12是数据的高位,78是数据的低位。
2、如何判断
判断的基本原理都是取出一个多字节数据结构的第一个字节,如果该字节是数据的高位,那么该机器就是大端;如果该字节是数据的低位,那么该机器就是小端。废话不说,上代码。
2.1 指针转换
#nclude <stdio.h> int isBigEndian(); int main() { printf("Size of int type:%d bytes.\n",sizeof(int)); int endianFlag=isBigEndian(); printf("endianFlag:%d\n",endianFlag); if (endianFlag) { printf("This is a Big Endian machine.\n"); }else { printf("This is NOT a Big Endian machine.\n"); } return 0; } int isBigEndian() { int a = 0x12345678; //通过将int强制类型转换成char单字节 char b = *(char *)&a; //通过判断起始存储位置,即第一个字节的内容,来判断是不是大端存储 if( b == 0x78) { return 0; } return 1; }
2.2 联合
#include <stdio.h> int isBigEndian(); int main() { printf("Size of int type:%d bytes.\n",sizeof(int)); int endianFlag=isBigEndian(); printf("endianFlag:%d\n",endianFlag); if (endianFlag) { printf("This is a Big Endian machine.\n"); }else { printf("This is NOT a Big Endian machine.\n"); } return 0; } int isBigEndian() { union IntCharUnion { int a; char b; }temp; temp.a = 0x12345678; if(temp.b == 0x78) { return 0; } return 1; }
原文地址:http://10798301.blog.51cto.com/10788301/1707386