Chinaunix

标题: 面试的时候碰到的一个题目,这题目我做错了,高手解释下 [打印本页]

作者: zheguzai    时间: 2011-09-10 17:40
标题: 面试的时候碰到的一个题目,这题目我做错了,高手解释下
本帖最后由 zheguzai 于 2011-09-10 17:42 编辑

面试的时候碰到的一个题目,这题目我做错了,高手解释下
这个题目是一个选择题目
在32位X86下
  1. int main()
  2. {
  3.         union
  4.         {
  5.                 int k;
  6.                 char i[2];
  7.                        
  8.         }*s,a;
  9.        
  10.         s = &a;
  11.         s->i[0] = 0x39;
  12.         s->i[1] = 0x38;
  13.        
  14.         printf("a.k = %x\n",a.k);
  15.         return 0;
  16. }
复制代码
A:3839    B:3938   C:380039      D:不可预知

我当时选择的是B,回来后在机子上实验了下是A,有人能解释下么 ?
作者: mirnshi    时间: 2011-09-10 17:56
回复 1# zheguzai


因为是x86, x86的字节顺序是先低后高,little-endian
作者: zheguzai    时间: 2011-09-10 18:06
回复 2# mirnshi


    搞了半天原来是在考大端小断存储啊,唉……
作者: ChiyuT    时间: 2011-09-10 18:31
回复 1# zheguzai


你怎么测出答案A的? 还有两个字节未定义,应该是D吧。
作者: greensnow    时间: 2011-09-10 19:47
D吧
作者: KBTiller    时间: 2011-09-10 19:51
回复  zheguzai


你怎么测出答案A的? 还有两个字节未定义,应该是D吧。
ChiyuT 发表于 2011-09-10 18:31



    同样的看法。
    int多大?
作者: mimepp    时间: 2011-09-10 20:52
$ ./a.out
a.k = 8043839
作者: zheguzai    时间: 2011-09-10 21:01
回复 7# mimepp


   我用C-FREE编译的,你们可以试试
作者: file3    时间: 2011-09-10 21:09
其实,现在的CPU都支持大小端切换。所以,这是操作系统决定的。 我选D
作者: davelv    时间: 2011-09-10 21:16
回复 10# file3
Oh my god~很惊人的论据 --!
作者: x5miao    时间: 2011-09-10 22:13
本帖最后由 x5miao 于 2011-09-10 22:15 编辑

回复 1# zheguzai


    维基百科上说所有的X86都是little-endian的

不过由于k的高位无法确定,所以我也倾向选D
作者: junj2121    时间: 2011-09-10 23:56
一看就应该知道是在考大小端的问题啊
作者: freearth    时间: 2011-09-11 00:02
回复 4# ChiyuT
同意这个。
作者: shimmey    时间: 2011-09-11 17:45
沒初始化啊,理論上結果應為D
但是如果編譯器自動初始化的話,那麽就是A
作者: shimmey    时间: 2011-09-11 17:46
沒初始化啊,理論上結果應為D
但是如果編譯器自動初始化的話,那麽就是A
作者: banggou    时间: 2011-09-11 23:54
本帖最后由 banggou 于 2011-09-11 23:56 编辑

要是看X86的汇编 可以看出 一般都会初始化为0的,同时又是小端嘛  所以运行应该是A吧
作者: mirnshi    时间: 2011-09-11 23:57
其实,现在的CPU都支持大小端切换。所以,这是操作系统决定的。 我选D
file3 发表于 2011-09-10 21:09


这个还是第一次听说,有出处吗?
作者: MMMIX    时间: 2011-09-12 00:05
这个还是第一次听说,有出处吗?
mirnshi 发表于 2011-09-11 23:57



    像 ARM,MIPS 之類的 CPU 確實是這樣。
作者: MMMIX    时间: 2011-09-12 00:08
要是看X86的汇编 可以看出 一般都会初始化为0的,同时又是小端嘛  所以运行应该是A吧
banggou 发表于 2011-09-11 23:54



    貼測試結果和匯編代碼吧,口說無憑。
作者: chenbin200818    时间: 2011-09-12 14:33
回复 7# mimepp

union没有初始化, 先 a.k = 0; 再试试
作者: adam8157    时间: 2011-09-12 14:40
是不是写错了int, 而是short
zzhzz18918 发表于 2011-09-10 21:03



    我觉得也该是short吧...要不这题就太没劲了
作者: 狼之鹏    时间: 2011-09-12 21:02
回复 1# zheguzai


    这个我在Ubuntu下做的测试。结果输出是这个:
  1. a.k = 8043839
复制代码

作者: 留痕之雁    时间: 2011-09-13 10:39
{:3_189:}{:3_189:}
自己在 Cygwin下看了看,

./a.exe

a.k=61153839

这个该选第D个答案吧!
作者: fateeye    时间: 2011-09-14 19:05
这个问题模棱两可的,毕竟要看大小端的。。。
不过一般X86平台上还是小端比较多。。
作者: MMMIX    时间: 2011-09-14 20:08
这个问题模棱两可的,毕竟要看大小端的。。。
不过一般X86平台上还是小端比较多。。
fateeye 发表于 2011-09-14 19:05



    給個大端 x86 的例子唄
作者: egmkang    时间: 2011-09-14 20:19
又是union......
作者: j3kljs02398j    时间: 2011-09-15 09:29
本帖最后由 j3kljs02398j 于 2011-09-15 09:31 编辑

回复 1# zheguzai


    感觉这个题应该是选 D。

0. 大端小端?
          12楼说维基百科说x86的是little-endian,确实如此。link:http://en.wikipedia.org/wiki/X86
Byte-addressing is supported and words are stored in memory with little-endian byte order.
这个是在overview里。
答案A和B就在考这个大小端。但是选答案A和B的前提是int是16bit。

1.  int是16bit?
          int多少位? 这个没有统一规定。
  1. ANSI 标准要求long型整数至少应该是32位, 而short型和int型整数的长度至少应该是16位。
  2. ---《c陷阱与缺陷》第七章 7.3 整数的大小
复制代码
还有就是short,int,long的长度是非递减的。经验不足,不知道X86下有没有特别说明。
int如果是32位,C也是可能了。

2. a初始化了吗?
          a在main函数内,应该是在栈中分配,不会初始化,得到的是随机数据,不一定都是0。
作者: davidfoxhu    时间: 2011-09-15 11:42
肯定不是A或B,楼主连续犯错误,不可原谅!
作者: lwrsmy    时间: 2011-09-15 12:54
1:联合体大小为sizeof(int),2个字节的内存中没有初始化,数值随机
2:大小端问题
作者: damcool    时间: 2011-09-15 14:26
回复  zheguzai


    维基百科上说所有的X86都是little-endian的

不过由于k的高位无法确定,所以我 ...
x5miao 发表于 2011-09-10 22:13



    支持,高位不确定!
作者: 嘟猫猫    时间: 2011-09-15 15:37
看高手解答。
作者: bombzhao    时间: 2011-09-19 10:43
其实,现在的CPU都支持大小端切换。所以,这是操作系统决定的。 我选D
file3 发表于 2011-09-10 21:09

CPU支持大小端切换是硬件确定的吧?
作者: MMMIX    时间: 2011-09-19 12:22
初始化a后,输出3839
未初始化输出乱码
reallyfly_1 发表于 2011-09-15 15:34



    你输出个乱码来看看?
作者: sun1279    时间: 2011-09-20 16:08
a.k = 993839
Linux localhost.localdomain 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:08:06 EDT 2010 i686 i686 i386 GNU/Linux




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2