Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:两个整数相乘为负值(溢出应该不会发生)_C_Variables_Types_Multiplication - Fatal编程技术网

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

我现在正在学习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=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);
}