首页 > 解决方案 > C 在内部使用哪个补码?

问题描述

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

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

标签: ctwos-complementones-complement

解决方案


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 。


推荐阅读