C:两个整数相乘为负值(溢出应该不会发生)
我现在正在学习C,我们得到了一个非常简单的矩阵乘法练习,它似乎适用于大多数测试用例。但是,有一个案例不起作用,我已经把它缩小到这段代码中,它不能产生预期的结果:C:两个整数相乘为负值(溢出应该不会发生),c,variables,types,multiplication,C,Variables,Types,Multiplication,我现在正在学习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
#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=1591061845129, mult2=2158989163359
显然,特别是第二个结果,我首先想到了溢出。但这真的不应该发生在这么小的数字上,是吗?输入肯定是一个整数(我们不能改变它),输出应该是一个长的,所以我不能改变数据类型,我不知道第二次乘法是如何得到一个负数的,也不知道第一个结果为什么是错误的
任何帮助都将不胜感激 试试这个
#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);
}
#包括
int main(){
int a1=1261373;
int b1=1261373;
int a2=1669717;
int b2=1293027;
long mult1=(long-long)a1*b1;//将一个操作数强制转换为long-long
长mult2=(长)a2*b2;
printf(“mult1=%ld,mult2=%ld”,mult1,mult2);
}
a1*b1
是一个int
,然后将其转换为长
。如果要使用long
乘法,请先将其中一个乘法转换为long
,如(long)a1*b1
。(另外,不要依赖表示任何特定位数的long
。如果您想要一个无符号的64位整数,请使用uint64\t
)可能重复的谢谢!!!这就解决了问题,我不知道你必须先把它转换成一个长的,但是现在所有的测试用例都能正常工作:)如果你考虑一下规则,“乘以两个int
s在C中创建一个int
”,这实际上很容易记住。另一方面,这是大多数C程序员遗憾地不知道的(在我看来,在随机选择的10个C程序员中,有2个会知道提升规则),如果你不知道的话,这会产生奇怪的结果。@Groo我知道整数提升,但我仍然认为它有时会产生奇怪的结果。;-)谢谢这就是问题所在,我必须在乘法之前将其转换。现在它工作了:)这个解决方案是不可移植的:是的,它会的,你能编辑答案吗,这样我就可以删除我的否决票:)
#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);
}