【发布时间】:2017-10-12 20:44:03
【问题描述】:
我现在正在学习 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
显然,尤其是第二个结果,我首先想到了溢出。但这真的不应该发生在这么小的数字上,不是吗?输入绝对是一个整数(我们不能改变它),输出应该是一个长整数,所以我不能改变数据类型,我不知道它是如何为第二次乘法得到一个负数的,或者为什么第一个结果错了。
任何帮助将不胜感激!
【问题讨论】:
-
a1 * b1是int,然后您将其转换为long。如果要使用long乘法,请先将其中一个转换为long,如(long)a1 * b1。 (另外,不要依赖long代表任何特定位数。如果您想要一个无符号的 64 位整数,请使用uint64_t。) -
谢谢!!!这解决了问题,我不知道您必须先将其转换为 long 但现在所有测试用例都可以正常工作:)
-
如果你考虑一下规则,“将两个
ints 相乘会在C 中创建一个int”,实际上这很容易记住。另一方面,integer promotion 是大多数 C 程序员遗憾地不知道的(在我看来,在随机选择的 10 个 C 程序员中,有 2 个会知道提升规则),并且 那个 会产生奇怪的如果你不知道,结果。 -
@Groo 我知道整数提升,但我仍然认为它有时会产生奇怪的结果。 ;-)
标签: c variables types multiplication