为什么我的变量除法时返回一个很大的负数?

问题描述 投票:0回答:1

我正在解决 cs50 的信用问题,我对一个部分的 for 循环感到困惑,因为我将一个长整数 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));
    }

可能是什么问题?

c cs50 integer-division
1个回答
0
投票

如注释中所述,有符号整数溢出会调用未定义的行为。当

temp
4003600000000014
divisor
100
时,结果为
40036000000000
,但我们随后尝试将其存储在
int
变量中,该变量很可能 32 位,并且是最大值可以存储在有符号 32 位整数中的是 2147483647

因此您的代码具有未定义的行为。

将信用卡号视为字符串更有意义,并且可以更轻松地迭代字符。

© www.soinside.com 2019 - 2024. All rights reserved.