1.在一个 big endian 的 32 位的计算机上,b 的结果是______

unsigned int a = 0x1234;
char b = *((char*)&a);

答案:0

解析:unsigned int是 4 个字节,0x1234 的完整表示是    低地址存高字节:0x 00 00 12 34,因为是 big endian,所以,所以 &(取地址) 的话,如果当字节看的话,取到了最左边 00 字节的地址,一定要转换成 char 看的话,值就是 0。

备注:如果是little endian 则会出现 低地址存低字节:0x43 21 00 00 ,则此时输出则为4。

 

2.在32位little endian机器上运行该程序,得到结果是什么? 

#include <stdio.h>
int main()
{
    long long a = 1, b = 2, c = 3;
    printf("%d %d %d \n", a, b, c);
    return 0;
}

A.1 2 3
B 1 0 2
C ...... 
D 3 2 1

解析:因为long long 是8个字节的,%d是4个字节的,溢出覆盖了后面,然后又是小端规则的。要正确输出应该是%lld。

(数字0、1都是16进制的),正常情况下是这样的。

00000000 00000001    00000000 00000010    00000000 00000011

         八字节a                       八字节b                           八字节c


little endian   

低地址存低字节:10000000 00000000    010000000 00000000    11000000 00000000

                     八字节a                       八字节b                           八字节c

 
传入参数,由右往左,栈空间内存从高往低,little endian, 栈空间如下:

内存高位->

00000000       00000011
00000000      [00000010](c)
[00000000](b) [00000001](a)
<-内存低位