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 。
在 中temp / divisor, 的值divisor100 被转换为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 适用: \xe2\x80\x9c 否则,新类型是有符号的,并且该值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。\xe2\x80\x9d
如果您使用的是 GCC,则转换被定义为换行模 2 N,其中N是目标类型的宽度(值和符号位的数量)。您显然有一个 32 位int,因此 40,036,000,000,000 被包装为模 2 32。
40,036,000,000,000 \xe2\x88\x92 9,322\xe2\x80\xa22 32 = \xe2\x88\x921,685,133,312,这就是结果。
\n