还是帮同学解题的时候踩坑了。
原码 | 无 |
反码 | 无 |
补码 | 10000000 |
一开始没发现,以至于每次输入-128的时候转换出来的格式是不正确的。然后自己算的时候发现问题了,八位原码里面第一位是符号位,剩下7位是数值位,2^7=128 算上负号 256 个数字,+0/-0各占一个,所以八位二进制原码表示十进制数的范围为 -127~127。
这谁顶得住啊,原题就是求 -128~127。
后来查了下,-128 没有原码和反码,(人为规定)补码为1000000(-0)。
附上原题的解法
# coding=utf-8
# 求 -128 ~ 127 的8位原码、反码、补码
# Copyright 2019 0xJacky<jacky-943572677@qq.com>
print("Please input a decimal integer between -128 ~ 127:")
i = int(input())
# 限定输入范围,否则无限循环
while i < -128 or i > 127:
print("Please input a decimal integer between -128 ~ 127:")
i = int(input())
inverse = ''
if i < 0 or i > -128:
# 对于 -127 < i < 0 的数进行处理
binary = format(i, '08b')[1:] # 格式化字符串,去掉负号,固定长度
# 逐项求反,得到反码
for b in binary:
if b == '1':
inverse += '0'
else:
inverse += '1'
# 下面加符号位(1)说明是个负数
binary = '1' + binary
# 二进制加法,求补码(负数的补码=反码末尾+1,二进制)
# int(字符串, 进制)
complement = int(inverse, 2) + int('1', 2)
complement = '1' + format(complement, '07b')
inverse = '1' + inverse
elif i >= 0:
# 正数的原码、反码、补码均相同
# 这里当做字符串处理并加上符号位(0)说明这个是正数
binary = format(i, '07b')
inverse = '0' + binary
complement = '0' + binary
binary = '0' + binary
else:
# 对 -128 特殊处理,因为 -128 的数值位已达到8位,加上符号吗后则变为9位
# 不符合定义,对此,经过询问前辈以及百度后得知,在 -128 的原码和补码不存在
# 人为规定其补码为 10000000(即为-0的补码)
# 补充说明,在《大学计算机》内,一般让学生求 -127 ~ 127
# 因为 +0, -0 的原码、补码、反码并不相同(符号位的差异)
binary = 'undefined'
inverse = 'undefined'
complement = '10000000'
print(binary, 'bin')
print(inverse, 'inv')
print(complement, 'comp')
文章最后修订于 2020年8月31日
评论 (0)