2010年10月8日星期五

本机大端/小端模式测试及解释

From: http://wxxweb.blog.163.com | Author: wxxweb | E-Mail: wxxweb@163.com
本文可任意转载,但请注明原文出处


测试程序代码:

#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,则说明机器为大端模式,否则为小端模式

1 条评论: