**符号**正整数的一元减运算符何时导致溢出?

dir*_*lik 6 c++

通常,INT_MIN-2 ^ nINT_MAX2 ^ n - 1

是否保证,如果x数型,int那么expressoin -x不会导致溢出?

Lun*_*din 4

它是隐式保证的,因为它对于所有允许的符号形式都是正确的:

(以 16 位为例int

  • 一个人的补语,INT_MIN = -32767, INT_MAX = 32767
  • 二进制补码,INT_MIN = -32768, INT_MAX = 32767
  • 符号和幅度,INT_MIN = -32767, INT_MAX = 32767

不允许使用其他形式。正如我们所看到的,abs(INT_MIN) >= abs(INT_MAX)对于所有允许的形式。

作为旁注,INT_MAX不允许小于 且32767不允许INT_MIN小于-32767。这是由 limit.h 的要求保证的。

  • @Yakk C++11 3.9.1 §7 `整数类型的表示应使用纯二进制计数系统来定义值。49 [示例:本国际标准允许整数类型的 2 补码、1 补码和带符号大小表示。-结束示例]`。C 语言的措辞有点不同,但同样适用。 (2认同)