【发布时间】:2012-10-18 01:19:18
【问题描述】:
所以我正在复习考试,我陷入了这个问题:
2.67 ◆◆ 你的任务是编写一个产生 1 的过程 int_size_is_32() 当在 int 为 32 位的机器上运行时,否则产生 0。你是 不允许使用 sizeof 运算符。这是第一次尝试:
1 /* The following code does not run properly on some machines */
2 int bad_int_size_is_32() {
3 /* Set most significant bit (msb) of 32-bit machine */
4 int set_msb = 1 << 31;
5 /* Shift past msb of 32-bit word */
6 int beyond_msb = 1 << 32;
7
8 /* set_msb is nonzero when word size >= 32
9 beyond_msb is zero when word size <= 32 */
10 return set_msb && !beyond_msb;
11 }
但是,当在 32 位 SUNSPARC 上编译和运行时,此过程返回 0。以下编译器消息为我们提供了问题的指示:警告:左移计数 >= 类型宽度
A.我们的代码在哪些方面不符合 C 标准?
B.修改代码以在数据类型为 int 的任何机器上正常运行 至少 32 位。
C.修改代码以在数据类型为 int 的任何机器上正常运行 至少 16 位。
__________ 我的回答:
A:当我们在第4行移位31时,我们溢出了,因为根据无符号整数标准,我们可以表示的最大无符号整数是2^31-1
B:在第 4 行 1
C:在第 4 行 1
我说的对吗?如果不是,为什么?谢谢!
__________ 第二个暂定答案:
B:在第 4 行 (1>1 和第 6 行: int beyond_msb = set_msb+1;我想这次我可能是对的:)
【问题讨论】:
-
可能你可以从这个问题stackoverflow.com/questions/3319717/…得到一个替代方案@
-
这是《CS:APP》一书中的一个好问题。第 2 章的内容会很好地为您服务。
-
这是编译时的事情。编译器、编译器设置和运行编译器的机器将决定 int 的大小,而不是程序运行的机器。