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

CS50信用卡问题:长整型除以100返回大负数的原因排查

CS50信用卡问题中的整数溢出异常

我在解决CS50的信用卡校验问题时遇到了异常:将长整型数值4003600000000014除以100时,得到了错误的大负数**-1685133312**。

以下是完整代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    long int number;
    long int temp;
    do
    {
        number = get_long("Number: ");
    } while (number < 0);

    temp = number;
    int counter = 1;
    for (int i = 10; i <= number; i = 10)
    {
        number /= i;
        counter += 1;
    }
    printf("%i\n", counter);

    int product = 0;
    int divisor = 100;
    int modulo = 0;
    //printf("%li\n", (temp % 100) / 10);
    for (int i = 0; i < counter / 2; i++)
    {
        modulo = temp / divisor;
        divisor *= 100;
        product += (2 * (modulo % 10));
    }
    printf("%i\n", product);
}

异常出现在这段循环代码中:

for (int i = 0; i < counter / 2; i++)
{
    modulo = temp / divisor;
    divisor *= 100;
    product += (2 * (modulo % 10));
}

问题原因

modulo被声明为int类型,而temp是long int类型。当执行temp / divisor时,结果的数值远超过了32位int的最大取值(2147483647),触发整数溢出。溢出后超出范围的数值会被截断,最终表现为负数。

解决方法

将modulo的类型从int改为long int,确保变量能容纳除法运算后的大数值,避免溢出:

long int modulo = 0;

内容的提问来源于stack exchange,提问作者GohanHango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:15