为什么以下程序会发生溢出?

Tom*_*Tom 9 c integer integer-overflow

void main () {
  int i;
  if (i < 0) { i = -i; };
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我理解为什么在上述程序中可能出现溢出?

das*_*ght 13

可能发生溢出,因为二进制补码中的整数表示的范围不对称:可以表示的最小负数的大小是可以表示的最高正数的大小加1.例如,在32位系统上,值为-2,147,483,6482,147,483,647.这就是为什么否定-2,147,483,648会导致溢出:否定的结果,一个正值2,147,483,648,不能用int相同的大小来表示.

请注意,此问题的反之亦然:否定正数不会导致溢出:

if (i > 0) { i = -i; } // No overflow here
Run Code Online (Sandbox Code Playgroud)

  • @Tom请注意,MSVC在`limits.h`中有`#define INT_MIN(-2147483647 - 1)`. (2认同)