我正在处理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));
}
型
有什么问题吗??
编辑:谢谢大家,我只需要把模类型变成长整型。
1条答案
按热度按时间hivapdat1#
在
temp / divisor
中,divisor
的值100被转换为long int
以匹配temp
,其值为4,003,600,000,000,014,然后在long int
中执行除法,产生40,036,000,000,000。然后,要将其分配给
int
modulo
,该值将转换为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,这就是结果。