一道面试题,看谁能答出来,x, y的值是多少?感觉这题出得很有水准,值了!!!
- int b = 0x12345678;
- int a = 0x9abc0e0d;
- char *p = (char *) &b;
- char *q = p + 2;
- int x = *q;
- int y = *(int *)q;
-
- x = ?
- y = ?
上面的题是现场做的,当时没写对,回去后也没全写对(只写对了x=0x56, 且只是在hpux上才对),但我知道这道题是考查:
大端、小端、栈结构、及数据对齐问题;实际上还考查了类型转换,运算符优先级问题
在x86的Linux上 与在HPUX 11iv3上是不一样。
大端(ia64):x = 0x56, y 值不可计算(core dump, BUS error, 数据对齐错误):
HPUX 11iv3 IA64,修改对齐(1,2,4)也不行
小端(x86):x = 0x34, y = 0xNN1234: NN表示二个字节任意值
下面是我的验证代码:
- #include <stdio.h>
- //#pragma pack(2)
- //#pragma align 2
- int main()
- {
- int b = 0x12345678;
- int a = 0x9abc0e0d;
- char *p = (char *) &b;
- char *q = p + 2;
- int x = *q;
- int y = *(int *)q;
- printf("a=0x%x b=0x%x, p=0x%p, q=0x%p\n", a, b, p, q);
- printf("&b=0x%x &a=0x%x\n", &b, &a);
- char *r = (char *) &a;
-
- printf("LOW:\n");
- for (int i = 0; i < 8; i++)
- printf("0x%x \n", *r++);
- printf("HIGH\n");
- printf("x=0x%x, y=0x%x\n", x, y);
- return 0;
- }
编译:gcc -std=c99 -o test2 test2.c
阅读(1387) | 评论(0) | 转发(0) |