补码的工作原理

固定宽度的整数以一串位存储,没有单独的符号字段。在有符号模式下,最高位兼作符号位:0表示非负,1表示负。把每一位取反再加1,就得到它的相反数。运算到位宽上限就会回绕,所以全1的位模式加1会变回全0。

同样的位,读法不同,含义也不同。字节11111111作为无符号数是255,作为有符号数则是−1。由于有符号范围并不以零对称(负数比正数多一个),对最负的有符号值取负(例如8位下的−128)没有正数与之对应——于是发生溢出,结果又变回自身。

试试点击最小、最大、-1和0这几个按钮,再点击+1或取负,看看某个位宽的取值范围会在哪里发生回绕。