请高手看一下这道问题
 #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 呢?

解决方案 »

  1.   

    这是因为INTEL芯片的不特征,即低地址存放低位数据,高地址存放高位数据,这样就得到3839
      

  2.   

    int 型的k和i公用内存,高字节是你的s->i[1], 低字节是s->i[0],
    所以就那样了
      

  3.   

    你的代码主要体现两个点:
     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。
      

  4.   

    不同的 CPU 有不同的处理方法,称为大印第安法,和小印第安法,Intel CPU 是小印第安法,即低字节在前,高字节在后. 其它的 CPU 如 68K则相反。看这个例子:
       char *tmp, 在内存中是 0x01,0x02,0x03,0x04, 则 (long *)tmp 的值在Intel CPU是 0x04030201.
      一般这个问题由 C 编译器处理,它会为不同的CPU 自动处理,编写应用程序可以不用管。
      

  5.   

    你的数在内存中是这样排列的0x39    1000h(假设的内存地址)
    0x38    1002h输出  (1000h)  内容时,cup会先根据你声明的类型相应的取n个字节的内容,最后取(1000h)的内容。