《编程精粹》中有一个例子,求有符号数取正数,若运行在二进制补码机器上,当为最小的负数(例如,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。