在 CPP 中否定 INT_MIN

Posted

技术标签:

【中文标题】在 CPP 中否定 INT_MIN【英文标题】:Negating INT_MIN in CPP 【发布时间】:2020-03-12 15:58:44 【问题描述】:

我要解决的问题是:

实现pow(x, n),计算x的幂n(Leetcode第50题)

我有以下代码:

class Solution 
 public:
  double myPow(double x, int n) 
    if (n == 0) 
      cout << "in last";
      return 1;
     else if (n < 0) 
      x = 1 / x;

      return myPow(x, -n);
     else if (n % 2 == 0) 
      double y;
      cout << "in even";
      y = myPow(x, n / 2);
      cout << "y is ";
      cout << y;
      return (y * y);

    

    else 
      cout << "in odd";
      double j = myPow(x, n - 1);
      cout << "j is ";
      cout << x * j;
      return (x * j);
    
  
;

针对测试用例 x=1.00000n = -2147483648 运行时。我收到错误:

runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself (solution.cpp)

为什么我会得到这个,我该如何解决? TIA

【问题讨论】:

对于典型的2的补码有符号整数类型,最小值的负数不能在该类型的正数范围内表示。 【参考方案1】:

如果你想支持-2147483648,那么你需要使用long long类型,而不是int

如果 int 是 32 位 2 的补码类型,则 2147483648 实际上是 longlong long 类型。

在 C++ 中不存在负字面量之类的东西(-2147483648 是一个编译时可评估的常量表达式,由字面量 2147483648 的否定组成),所以 -2147483648 要么是 long 要么是 @987654332 @类型也是。这就是为什么你会经常看到 INT_MIN 被定义为 -2147483647 - 1

如果在您的平台上出现上述情况,那么您的代码的行为对于该输入是未定义,因为您正在溢出int 类型。

【讨论】:

以上是关于在 CPP 中否定 INT_MIN的主要内容,如果未能解决你的问题,请参考以下文章

UDS中的否定响应和肯定响应,已经CAN通讯中的特点

RestAssured API测试框架中的否定断言或否定匹配[关闭]

“成员”集合的 PL/SQL 否定不否定

如何在 Detox 中添加诸如 not.toHaveText 之类的否定断言?

小酌重构系列[21]——避免双重否定

在 CloudFormation 模板中否定条件