接题目:
/* The following code does not run properly on some machines */
int bad_int_size_is_32() {
/* Set most significant bit (msb) of 32-bit machine */
int set_msb = 1 << 31;
/* Shift past msb of 32-bit word */
int beyond_msb = 1 << 32;
/* set_ msb is nonzero when word size >= 32
beyond_msb is zero when word size <= 32 */
return set_msb && !beyond_msb;
}
当在SUN SPARC这样的32位机器上编译并运行时,这个过程返回的却是0。下面的编译器
信息给了我们一个问题的指示:
warning: left shift count >= width of type
A.我们的代码在哪个方面没有遵守C语言标准?
B.修改代码,使得它在int至少为32位的任何机器上都能正确地运行。
C.修改代码,使得它在int至少为16 位的任何机器上都能正确地运行。
开始作答 官方答案(已验证)
A.要进行左移的数大于或等于x的宽度。
B.修改如下:
int bad_int_size_is_32() {
int set_msb = 1 << 31;
int beyond_msb = set_msb << 1;
return set_msb && !beyond_msb;
}
C.关键就是在不能一次左移达到这个x的位数,不符合标准。
#include <stdio.h>
#include <assert.h>
/* The following code does not run properly on some machines */
int int_size_is_32() {
int set_msb = 1 << 31;
int beyond_msb = set_msb << 1;
return set_msb && !beyond_msb;
}
int int_size_is_32_for_16bit() {
int set_msb = 1 << 15 << 15 << 1;
int beyond_msb = set_msb << 1;
return set_msb && !beyond_msb;
}
int main(int argc, char* argv[]) {
assert(int_size_is_32());
assert(int_size_is_32_for_16bit());
return 0;
}