我正在解决 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));
}
可能是什么问题?
如注释中所述,有符号整数溢出会调用未定义的行为。当
temp
为 4003600000000014
且 divisor
为 100
时,结果为 40036000000000
,但我们随后尝试将其存储在 int
变量中,该变量很可能 32 位,并且是最大值可以存储在有符号 32 位整数中的是 2147483647
。因此您的代码具有未定义的行为。
将信用卡号视为字符串更有意义,并且可以更轻松地迭代字符。