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

ie3xauqp  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

我正在处理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));
    }


有什么问题吗??
编辑:谢谢大家,我只需要把模类型变成长整型。

hivapdat

hivapdat1#

temp / divisor中,divisor的值100被转换为long int以匹配temp,其值为4,003,600,000,000,014,然后在long int中执行除法,产生40,036,000,000,000。
然后,要将其分配给intmodulo,该值将转换为int。它无法在int中表示,因此C 2018 6.3.1.3 3适用:否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,或者引发实现定义的信号。
如果你使用的是GCC,the conversion is defined to wrap modulo 2N,其中 N 是目标类型的宽度(值和符号位的数量)。你显然有一个32位的int,所以40,036,000,000,000被 Package 为模232。
40,036,000,000,000 − 9,322·232 = − 1,685,133,312,这就是结果。

相关问题