C:两个整数相乘为负值(溢出不应该发生)
C: two integers multiply to negative value (overflow shouldn't happen yet)
我目前正在学习 C,我们得到了一个非常简单的矩阵乘法练习,它似乎适用于大多数测试用例。然而,有一个案例不起作用,我已经将其缩小到这段代码,它没有产生预期的结果:
#include <stdio.h>
int main(){
int a1 = 1261373;
int b1 = 1261373;
int a2 = 1669717;
int b2 = 1293027;
long mult1 = a1*b1;
long mult2 = a2*b2;
printf("mult1=%ld , mult2=%ld", mult1, mult2);
}
我得到的输出是:
mult1=1923945609 , mult2=-1379386529
而不是预期的:
mult1=1591061845129, mult2=2158989163359
显然,尤其是第二个结果,我首先想到的是溢出。但这真的不应该发生在这么小的数字上,不是吗?输入绝对是一个整数(我们不能改变它)并且输出应该是一个 long 所以我不能改变数据类型而且我不知道第二次乘法如何得到负数或者为什么第一个结果错了。
如有任何帮助,我们将不胜感激!
试试这个
#include <stdio.h>
int main(){
int a1 = 1261373;
int b1 = 1261373;
int a2 = 1669717;
int b2 = 1293027;
long mult1 = (long long)a1*b1; //Type cast one operand to long long
long mult2 = (long long)a2*b2;
printf("mult1=%ld , mult2=%ld", mult1, mult2);
}
我目前正在学习 C,我们得到了一个非常简单的矩阵乘法练习,它似乎适用于大多数测试用例。然而,有一个案例不起作用,我已经将其缩小到这段代码,它没有产生预期的结果:
#include <stdio.h>
int main(){
int a1 = 1261373;
int b1 = 1261373;
int a2 = 1669717;
int b2 = 1293027;
long mult1 = a1*b1;
long mult2 = a2*b2;
printf("mult1=%ld , mult2=%ld", mult1, mult2);
}
我得到的输出是:
mult1=1923945609 , mult2=-1379386529
而不是预期的:
mult1=1591061845129, mult2=2158989163359
显然,尤其是第二个结果,我首先想到的是溢出。但这真的不应该发生在这么小的数字上,不是吗?输入绝对是一个整数(我们不能改变它)并且输出应该是一个 long 所以我不能改变数据类型而且我不知道第二次乘法如何得到负数或者为什么第一个结果错了。
如有任何帮助,我们将不胜感激!
试试这个
#include <stdio.h>
int main(){
int a1 = 1261373;
int b1 = 1261373;
int a2 = 1669717;
int b2 = 1293027;
long mult1 = (long long)a1*b1; //Type cast one operand to long long
long mult2 = (long long)a2*b2;
printf("mult1=%ld , mult2=%ld", mult1, mult2);
}