测试OS的大端小端模式的例子网上最为普通暴力的方式是:
定义int变量,取高地址的数和相邻低地址存放的值的关系:高地址放高
位,低地址放着地位,就是little endian,反之,则为high endian
但是,借助共用体也可以,参照这思路,也可以这样玩,算是对共用体的一个小小的应用!
#include <stdio.h>
typedef union
{
unsigned short int value;
unsigned char byte[2];
} to;
void endian_test()
{
to test;
to test2;
test.value = 0xabcd;
test2.value = 0xcdef;
// 0xab 是高位 放在高字节的话就是 小端模式
// 反之 则为大端模式
// 注意到 变量存在与栈中,byte[0] 在高地址处
if(test.byte[0]==0xcd)
{
printf("little endian\n");
}
if(test.byte[0] == 0xab)
{
printf("big endian\n");
}
printf("byte[0],%x,add:%x\n", test.byte[0],&test.byte[0]);
printf("byte[1],%x,add:%x\n", test.byte[1],&test.byte[1]);
printf("test2:\n");
printf("byte[0],%x,add:%x\n", test2.byte[0],&test2.byte[0]);
printf("byte[1],%x,add:%x\n", test2.byte[1],&test2.byte[1]);
}
int main(int argc, char *argv[])
{
endian_test();
return 0;
}
本来事情就这么完了,但是小脑一抽,联系到程序映像的栈段,test 肯定定义在栈段,错误的认为:byte[0] 在高地址,byte[1] 在低地址
一次性开辟的变量(包括数组)是连续分配的,所以高地址放着数组高位
当然,紧跟着的变量,就按照压栈的原则来做的
看图: