C 在内部使用哪个补码?

Mig*_*l M 0 c twos-complement ones-complement

我查找的所有内容只是告诉我如何在 C 中进行补充运算/计算。

我想知道 C 在内部使用什么表示以及它如何处理溢出。

PSk*_*cik 5

C 允许有符号整数的 3 表示(https://port70.net/~nsz/c/c11/n1570.html#6.2.6.2p2):

  • 符号位为 0 的对应值被取反(符号和大小);
  • 符号位的值为 -(2M)(二进制补码);
  • 符号位的值为 -(2M- 1)(一个的补码)。

补码是最常见的。

无符号溢出环绕无符号的最大值。

有符号溢出会导致未定义的行为。即,假定它不会发生,并且如果您确实做到了,则不能保证您的程序的行为。

签名原子中的溢出是一个例外:它定义明确,并且在那里强制要求二进制补码:https ://port70.net/~nsz/c/c11/n1570.html#7.17.7.5p3 。