C语言unsigned long long直接乘法结果异常,循环累加却正确?
问题原因与解决方法
你的问题根源是整数运算的类型默认规则导致的溢出:
直接执行
260000000 * 25时,两个操作数都是默认的int类型(多数系统中int为4字节,最大值约2147483647)。计算结果6500000000远超int的上限,触发有符号整数溢出。虽然C标准将这种情况定义为未定义行为,但多数编译器会让数值回绕成负数,之后这个负数被转换为unsigned long long类型时,就变成了你看到的异常大值18446744071619617024。循环累加的方式不会出现这个问题:每次执行
num += 260000000时,260000000会被自动提升为unsigned long long类型(因为num是该类型),所有加法操作都在unsigned long long的有效范围内进行,最终得到正确结果。
修复方案
只需要让乘法运算在unsigned long long类型下执行即可,有两种常用方式:
- 强制转换其中一个操作数:
num = (unsigned long long)260000000 * 25;
- 使用
ULL后缀标记其中一个常量为无符号长整型:
num = 260000000ULL * 25;
内容的提问来源于stack exchange,提问作者a regular coder
相关产品推荐
相关产品推荐

