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

Goh*_*ngo 2 c integer-division cs50

我正在解决 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);
}
Run Code Online (Sandbox Code Playgroud)

这是发生除法的部分。

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

可能是什么问题呢?

编辑:谢谢你们,我只需要制作模类型 long int 。

Eri*_*hil 6

在 中temp / divisor, 的值divisor100 被转换为long int匹配temp,其值为 4,003,600,000,000,014,然后在 中执行除法long int,产生 40,036,000,000,000。

\n

然后,要将其分配给int modulo,将该值转换为int。它无法在 中表示int,因此 C 2018 6.3.1.3 3 适用: \xe2\x80\x9c 否则,新类型是有符号的,并且该值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。\xe2\x80\x9d

\n

如果您使用的是 GCC,则转换被定义为换行模 2 N,其中N是目标类型的宽度(值和符号位的数量)。您显然有一个 32 位int,因此 40,036,000,000,000 被包装为模 2 32

\n

40,036,000,000,000 \xe2\x88\x92 9,322\xe2\x80\xa22 32 = \xe2\x88\x921,685,133,312,这就是结果。

\n