对计算机中负数表示的思考
2014-01-10 14:47
274 查看
我们都知道计算机中负数用补码表示,即 :取反 加1,那为什么这么蛋疼的表示呢,既然要区分正负数,直接用最高位来区分不就行了吗?
仔细思考了下,负数用补码表示是为了实现加法和减法的统一(更确切说就是为了实现减法)。
设要表示的整数 I 由 b 位存储,那么 I <= 2^b - 1。下面讨论均是整数。
设有一正整数I1,和正整数I2,那么计算机如何计算I1 - I2。
I1 - I2 = (I1 + 2^b - I2) % (2^b)
而2^b - I2 == (~I2) + 1
所以将负数表示为(~I2) + 1可以统一加减法。对 (~I2)+1 求补 会得到I2,前面加上-就是-I2
同时(~I2) + 1 的 最高位为1,所以拿最高位来判断是否要求补,是否要加-。
那么对于无符号数,怎么转成有符号数,比如python中没有int8_t类型,一般的整型数都是32位。
那么可以判断第8位是否为1,为1的话对其取反+1,然后加-即可。手动模拟这个过程
仔细思考了下,负数用补码表示是为了实现加法和减法的统一(更确切说就是为了实现减法)。
设要表示的整数 I 由 b 位存储,那么 I <= 2^b - 1。下面讨论均是整数。
设有一正整数I1,和正整数I2,那么计算机如何计算I1 - I2。
I1 - I2 = (I1 + 2^b - I2) % (2^b)
而2^b - I2 == (~I2) + 1
所以将负数表示为(~I2) + 1可以统一加减法。对 (~I2)+1 求补 会得到I2,前面加上-就是-I2
同时(~I2) + 1 的 最高位为1,所以拿最高位来判断是否要求补,是否要加-。
那么对于无符号数,怎么转成有符号数,比如python中没有int8_t类型,一般的整型数都是32位。
那么可以判断第8位是否为1,为1的话对其取反+1,然后加-即可。手动模拟这个过程
def main(): val = int(raw_input()) print val >> 7 if ( val >> 7 ) == 1: val = (~val) & 0xff + 1 # 取后8位,默认32位 val = 0 - val print val if __name__ == '__main__': main()
相关文章推荐
- 负数在计算机中的表示
- 负数在计算机中如何表示,计算机中负数为什么用补码表示?
- Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换
- 负数在计算机中表示
- 原码、反码、补码,计算机中负数的表示
- 负数在计算机中如何表示
- 负数在计算机中的表示
- 计算机中负数的表示方法
- 负数在计算机中的表示 Byte-128
- 计算机中负数表示法
- 负数在计算机中的表示
- 原码、反码、补码,计算机中负数的表示
- 负数在计算机中的表示
- 计算机中负数和正数的二进制表示
- 负数在计算机中的表示
- 负数在计算机中如何表示?为什么用补码存储
- 原码、补码、反码及计算机中负数的表示
- 负数在计算机中的表示和存储
- 原码、反码、补码,计算机中负数的表示
- 让我细细捋一捋原码反码补码以及计算机中负数的表示