C在内部使用哪个补码?
我查找的所有内容只是告诉我如何在 C 中进行补充运算/计算。
我想知道 C 在内部使用什么表示以及它如何处理溢出。
回答
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 。