Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582162
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类: C/C++

2013-01-04 09:47:37

一道面试题,看谁能答出来,x, y的值是多少?感觉这题出得很有水准,值了!!!

点击(此处)折叠或打开

  1.     int b = 0x12345678;
  2.     int a = 0x9abc0e0d;

  3.     char *p = (char *) &b;
  4.     char *q = p + 2;
  5.     int x = *q;
  6.     int y = *(int *)q;
  7.      
  8.     x = ?
  9.     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表示二个字节任意值

下面是我的验证代码:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. //#pragma pack(2)
  3. //#pragma align 2

  4. int main()
  5. {
  6.     int b = 0x12345678;
  7.     int a = 0x9abc0e0d;

  8.     char *p = (char *) &b;
  9.     char *q = p + 2;
  10.     int x = *q;
  11.     int y = *(int *)q;

  12.     printf("a=0x%x b=0x%x, p=0x%p, q=0x%p\n", a, b, p, q);

  13.     printf("&b=0x%x &a=0x%x\n", &b, &a);
  14.     char *r = (char *) &a;
  15.         
  16.     printf("LOW:\n");
  17.     for (int i = 0; i < 8; i++)
  18.         printf("0x%x \n", *r++);
  19.     printf("HIGH\n");

  20.     printf("x=0x%x, y=0x%x\n", x, y);

  21.     return 0;
  22. }
编译:gcc -std=c99 -o test2 test2.c
阅读(1355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~