Back to Top

求有符号数最小值的正数

《编程精粹》中有一个例子,求有符号数取正数,若运行在二进制补码机器上,当为最小的负数(例如,16 位机器的-32768) 时就会出现问题。原因在于表达式i= -i 中的-i 上;即上溢超出了有符号类型的范围,解决办法是i= -i 后,将i强转为无符号数。

补码如何计算

补码是如何得来的,计算机使用二进制表示数字,如果简单的将正数和负数转化为二进制,则无法简单实现同一数字的正数加负数为零的数学常识。

举个例子:八位数字4的正数负数二进制为:

  0000 0100
+ 1000 0100
------------
  1000 1000

一种方案是使用溢出的方式将其变为负数:

  0000 0100
+ 1111 1011
------------
  1111 1111
+ 0000 0001
------------
  0000 0000

将正数的二进制,取反,加1得到的数字我们称为补码。

有符号数最小值的取反

举个例子:八位数字-128的负数二进制为:

        1000 0000
(反)   0111 1111 
(补)   1000 0000

当它是有符号数时,为-128,当它是无符号数时是128。