You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:43:18