为何调用count_bit函数传入大数会触发有符号整数溢出?
问题分析与修复
核心问题原因
- 循环无限执行导致计数溢出:代码里的
num>>1;仅执行了右移运算,但未将结果赋值回num,导致num始终保持初始传入的大数值,循环条件num>0永远成立。计数变量cnt会持续自增,直到超过int类型的最大值(2147483647),此时再加1就触发了有符号整数溢出,也就是你看到的报错。 - 运算符优先级隐患:
num&1 == 1中,==的优先级高于按位与&,实际执行的是num & (1==1)(即num & 1)。虽然这个结果和预期一致,但写法不规范,容易引发后续逻辑错误,建议用括号明确优先级。
修正后的代码
int count_bit(long long num) { int cnt = 0; while (num > 0) { if ((num & 1) == 1) cnt++; num >>= 1; // 等价于 num = num >> 1; 完成赋值,让num逐步缩小 } return cnt; }
额外说明
如果需要处理负数的二进制1的个数(比如基于补码统计),可以将循环条件改为num != 0,这样能覆盖负数的情况。当前代码逻辑仅针对正数统计,保持num>0即可。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

