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机器上运行该程序,得到结果是什么?
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)
<-内存低位