请高手看一下这道问题
#include "stdio.h"
main()
{
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39; s->i[1]=0x38;
printf("%x\n",s->k);
}
输出的是 3839
请指教一下这是为什么,为什么不是 3938 呢?
#include "stdio.h"
main()
{
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39; s->i[1]=0x38;
printf("%x\n",s->k);
}
输出的是 3839
请指教一下这是为什么,为什么不是 3938 呢?
所以就那样了
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39; s->i[1]=0x38;
printf("%x\n",s->k);1. union, 共用内存,这个教科书上都有说
2. CPU 内的字节顺序问题,有两种 little-indian, 和big-indian, 即大小印第安,Intel系列的CPU 低字节在前,高字节在后,属于小印第安, 其它的CPU, 如 68K, 则相反,一般这个问题是交给 C 编译器解决。编写应用程序不用关心。
看另一个例子: 一个 char 数组,内存中 0x01,0x02,0x03,0x04,它的指针 *tmpc, 则 (long *)tmpc, 对Intel CPU 值是 0x04030201。
char *tmp, 在内存中是 0x01,0x02,0x03,0x04, 则 (long *)tmp 的值在Intel CPU是 0x04030201.
一般这个问题由 C 编译器处理,它会为不同的CPU 自动处理,编写应用程序可以不用管。
0x38 1002h输出 (1000h) 内容时,cup会先根据你声明的类型相应的取n个字节的内容,最后取(1000h)的内容。