【问题标题】:C: two integers multiply to negative value (overflow shouldn't happen yet)C:两个整数相乘为负值(溢出应该还没有发生)
【发布时间】: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 * b1int,然后您将其转换为 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


【解决方案1】:

试试这个

#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);
}

【讨论】:

  • 谢谢!这就是问题所在,我必须在乘法之前对其进行转换。现在它可以工作了:)
  • 此解决方案不可移植:stackoverflow.com/questions/6155784/…
  • 是的,它会的,你能编辑答案,以便我删除我的反对票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2016-10-19
  • 2020-06-12
  • 1970-01-01
  • 2015-03-30
  • 2016-03-01
相关资源
最近更新 更多