在C/C++中无法取消-2147483648?

smi*_*dha 5 c c++ integer

#include <iostream>
#include <stdlib.h>

int main(int argc, char *argv[])
{

  int num=-2147483648;
  int positivenum=-num;
  int absval=abs(num);

  std::cout<<positivenum<<"\n";
  std::cout<<absval<<"\n";

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

嗨,我很好奇为什么输出上面的代码是

-2147483648
-2147483648
Run Code Online (Sandbox Code Playgroud)

现在我知道这-2147483648是签名的int中最小的可重复数字(假设int是32位).我会假设只有在我们低于这个数字后才会得到垃圾回答.但在这种情况下,+ 21148383648由32位整数系统覆盖.那么为什么两种情况下的否定答案呢?

Mys*_*ial 15

但在这种情况下,+ 21148383648由32位整数系统覆盖.

不太正确.它只能达到+2147483647.所以你的假设是不对的.

否定-2147483648确实会产生2147483648,但它会溢出回来-2147483648.

此外,有符号整数溢出在技术上是未定义的行为.


Ant*_*ake 7

在32位signed int中无法使用值 - ( - 2147483648).带符号的32位int的范围是-2147483648到2147483647