【问题标题】:- -100 cannot be represented in type 'int'- -100 不能用“int”类型表示
【发布时间】:2021-12-04 04:09:07
【问题描述】:

signed integer overflow: 2147483647为什么会抛出:

运行时错误:有符号整数溢出:2147483647 - -100 无法在此代码的“int”类型中表示

 temp = abs(nums[i]+nums[j]+nums[k]-target);

 if(temp < abs(minTarget-target)){
     minTarget = nums[i]+nums[j]+nums[k];
 }

?

【问题讨论】:

  • int 具有最大可表示值。在您的特定环境中,2147483647 等于或低于该最大值,但 2147483647 + 100 高于该最大值。
  • 请显示minimal reproducible example。你用的是c还是c++?
  • 2147483647 是 32 位 int 通常可以表示的最大值 - 添加 100 将超过该类型可以表示的值,从而导致溢出。这大概就是您看到的错误消息所代表的内容。有符号整数类型的溢出具有未定义的行为。请记住,尽管您的编译器/系统可能支持 32 位 int,但标准仅保证 int 可以表示 -3276732767 之间的值。

标签: c++ c gcc


【解决方案1】:

- -100 不能用int 类型表示

- -100 是 +100,可以表示为 intsum 是个问题。

2147483647 - -100 在数学上是 2147483747,但 sum 超出了 OP 的 32 位 int 范围 [-2147483648 ... 2147483647],因此出现运行时错误。


代码可以使用 64 位数学来防止溢出。然而,如果minTarget 必须保留为int,问题可能仍然存在。

 long long temp = llabs(0LL + nums[i] + nums[j] + nums[k] - target);

 if(temp < llabs(0LL + minTarget - target)){
   minTarget = 0LL + nums[i] + nums[j] + nums[k];
 }

0LL + ... 确保在加法/减法中至少有 64 位数学运算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-22
    • 2023-03-17
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2011-12-24
    • 2021-10-29
    相关资源
    最近更新 更多