【问题标题】:What is the error in multiplication of long long Integer?long long Integer 的乘法错误是什么?
【发布时间】:2015-07-20 20:42:36
【问题描述】:
 #include<stdio.h>
 int main()
 {
     long long int t=8*9*100000000;// 8 zeros
     printf("%lld\n",t);
     return 0;
 }

给出结果: -1389934592


请回复

 #include<stdio.h>
 int main()
 {
     long long int t=8*9*1000000000; //9zeros
     printf("%lld\n",t);
     return 0;
 }

给出结果: -1014444032


而所有其他乘法都给出了正确的结果,即

 #include<stdio.h>
 int main()
 {
     long long int t=8*9*10000000000; //10zeros or greater or zeros <=6
     printf("%lld\n",t);
     return 0;
 }

给出结果: 720000000000


【问题讨论】:

  • 由于有符号整数溢出导致的未定义行为未定义。任何事情都有可能发生。将 LL 与您的文字一起使用。
  • 试试这个:8LL*9LL*1000000000LL(9 个零)
  • 我认为讨论舍入结果比讨论未定义行为更好,结果在逻辑上由运算符类型维度定义,因为编译器将 100,000,000 视为 32 位整数,而不是 64 位作为类型long long int t。如果你使用t=8 * 9* k;,行为是相同的,其中k是int k=100000000;
  • @SergioFormiggini 浮点数发生舍入,整数根本不舍入。虽然这个结果对我们来说是合乎逻辑的,但在非双补设备或不同大小的设备上,结果会有所不同。它被指定为 undefined 是有原因的。
  • 好的!已收到! ,,, 我没有考虑非双补设备! :p(四舍五入我的意思是截断,但你的解释清楚了我最好将这种情况一般视为未定义的行为)

标签: c memory int long-integer


【解决方案1】:

100000000 带有 8 个零或 1000000000 带有 9 个零适合 32 位 intlong,而不是 long long),这是默认设置。然后用 32 位 int´s 进行乘法运算,
然后将结果转换为 64 位。
这是一个问题,因为结果不适合 32 位 => 溢出。

使用 10 个零,您将从一开始就拥有一个 64 位 int
因为这个数字不适合 32 位 int
=> 计算是用 64 位完成的,没问题。

如果要将 8 零和 9 零数字用作long long,请使用LL, IE。 100000000LL

【讨论】:

    【解决方案2】:
    8*9*1000000000; //9zeros  
    

    is (32bit) * (32bit) * (32bit) --> 答案放入32bit 而

    8*9*10000000000; //10zeros
    

    是 (32bit) * (32bit) * (64bit) --> 答案是把 info 64bit

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多