判断整数类型的位数:我的C代码是否具备可移植性?
关于你的整数位数计算C程序的可移植性分析
首先贴出你的代码:
#include <stdio.h> int int_size(void); int main(int argc, char *argv[]) { printf("%d\n", int_size()); return 0; } int int_size(void) { int count = 1; int value = 1; while (1) { value <<= 1; if (value > 0) { count++; } else { break; } } return count + 1; }
核心问题解答:是否存在负数最高位不为1的机器?
你提到的三种负数表示(补码、反码、符号-数值)是C标准允许的全部形式,这三种表示的负数最高位(符号位)都是1——C标准明确要求有符号整数的符号位必须是最高位,所以不存在符合C标准的系统会让负数最高位不为1,你的这个前提是正确的。
但你的代码存在可移植性隐患
问题出在有符号整数的左移溢出行为是未定义的。当value左移到某个位置时,再左移会导致有符号整数溢出,根据C标准,这种情况的行为是不确定的——可能在你测试的编译器上正常工作,但在其他环境下可能崩溃、返回错误值,或者出现其他不可预料的结果。
更可靠的可移植实现方法
推荐两种更安全的方案:
方案1:使用无符号整数(避免溢出未定义行为)
无符号整数的左移是逻辑左移,溢出行为是明确的(高位丢弃,低位补0),不会触发未定义行为:
#include <stdio.h> int int_size(void) { unsigned int value = 1; int count = 0; while (value != 0) { count++; value <<= 1; } return count; } int main() { printf("%d\n", int_size()); return 0; }
方案2:利用标准库宏(最简洁可靠)
直接使用sizeof获取int的字节数,结合CHAR_BIT(定义在<limits.h>中,表示每个字节的位数)计算:
#include <stdio.h> #include <limits.h> int main() { printf("%d\n", (int)(sizeof(int) * CHAR_BIT)); return 0; }
这种方法完全依赖标准库定义,是最符合C标准的可移植实现。
内容的提问来源于stack exchange,提问作者user9026
相关产品推荐
相关产品推荐

