所以我正在复习考试,我陷入了这个问题:
2.67 ◆◆ 你的任务是编写一个过程int_size_is_32(),当它在一个int 为32 位的机器上运行时产生1,否则产生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 时,我们溢出了,bec 根据无符号整数标准,我们可以表示的最大无符号整数是 2^31-1
B:在第 4 行 1<<30
C:在第 4 行 1<<14 和在第 6 行 1<<16
我对吗?如果不是,为什么?谢谢!
__ _ __ _ ____第二个暂定答案:
B:在第 4 行 (1<<31)>>1 和在第 6 行: int beyond_msb = set_msb+1; 我想这次我可能是对的:)