测试程序代码:
#include <stdio.h>
void checkCPUendian();
int main()
{
checkCPUendian();
return 0;
}
void checkCPUendian()
{
union{
unsigned int i;
unsigned char s[4];
}c;
c.i = 0x12345678;
printf("%s/n", (0x12 == c.s[0]) ? "大端模式" : "小端模式");
}
我的解释:
我们知道,联合体的不同成员在内存中空间是重叠所以……
给联合变量c的第一个成员(无符号整型i,占4个字节)赋值
c.i = 0x12345678;
对于大端模式,数据最高有效位存储在最低地址,因此 i 在内存中存储如下:
__________________________
低地址 | 12 | 34 | 56 | 78 | 高地址
------------------------------------------
对照着字符数组各元素的值就是:
c.s[0] = 0x12
c.s[1] = 0x34
c.s[2] = 0x56
c.s[3] = 0x78
而对于小端模式,数据最小有效位存储在最低地址,则 i 在内存中存储如下:
__________________________
低地址 | 78 | 56 | 34 | 12 | 高地址
------------------------------------------
那么字符数组各元素值变成:
c.s[0] = 0x78
c.s[1] = 0x56
c.s[2] = 0x34
c.s[3] = 0x12
因此,如果c.s[0]的值为0x12,则说明机器为大端模式,否则为小端模式
转自:http://wxxweb.blog.163.com/blog/static/135126900201031464811141/