为什么有原码、补码、反码和移码?
时间: 2023-06-10 17:03:44 浏览: 231
原码、补码、反码和移码都是用来表示一个数值的不同方式。它们的存在是为了解决计算机中数字的表示和运算的问题。原码是最基本的表示方式,即用二进制表示数值,其中最高位表示符号位(0为正,1为负)。但是,在使用原码进行数值运算时,加减法需要特殊处理符号位,而且存在正零和负零的问题。
为了解决这些问题,人们发明了反码和补码。反码是将正数的符号位不变,负数的符号位取反得到的一种表示方式。它消除了加减法的符号位特殊处理问题,但是仍然存在正零和负零的问题。补码是对反码再进行一次处理,即将反码加1得到的一种表示方式。它解决了正零和负零的问题,而且在运算过程中也可以看做是在原码基础上加上一个偏移量。
移码是一种用于表示浮点数的方式,和整数的原码、补码和反码不同。它将数值移动一个固定的偏移量来表示,其中最高位表示符号位。移码的存在是为了便于进行浮点数的运算。
相关问题
原码 补码 反码 移码
这四种编码方式都是用来表示二进制数的,常用于计算机系统中。它们的应用场景主要涉及到数字表示、算术运算和数据存储等方面。
1. 原码:最简单的表示法,即将数字的二进制码直接表示出来。例如,+5 的原码为 00000101,-5 的原码为 10000101。
2. 反码:正数的反码与原码相同,负数的反码是将原码中除符号位以外的各位取反。例如,+5 的反码为 00000101,-5 的反码为 11111010。
3. 补码:正数的补码与原码相同,负数的补码是将其反码加 1。例如,+5 的补码为 00000101,-5 的补码为 11111011。
4. 移码:与补码相似,是将其原码表示中的所有位都向左移动了一个位置,并在最高位添加了一个符号位。例如,+5 的移码为 100000101,-5 的移码为 110000101。
在计算机系统中,通常使用补码来表示负数,因为加减运算可以直接使用补码进行,而不需要额外的转换过程。反码和原码较少使用,移码则主要用于浮点数的表示。
原码补码反码移码计算
### 原码、补码、反码和移码的计算方法
#### 定义与用途
在计算机系统中,为了有效地处理正负数以及简化硬件设计,引入了四种不同的编码方式:原码、反码、补码和移码[^1]。
#### 计算过程
对于8位二进制数为例:
- **原码**
- 正数的原码为其本身的二进制形式;而负数则是在最高位设置为`1`作为符号位,其余部分保持绝对值对应的二进制表示。
- **反码**
- 对于正数而言,其反码与其原码相同;
- 而对于负数来说,则需先保留最左边一位即符号位不变,再将其余各位按位取反得到的结果称为该数的反码[^2]。
- **补码**
- 当涉及的是正值时,它的补码等于自身的原码;
- 若是负值的话,在获取到此数的反码之后还需对该结果加上一个最低有效位上的`1`形成最终的补码表达形式。值得注意的是,这样做可以使得两个相反数相加后的总和恰好为零(不考虑溢出情况),从而方便CPU执行加法运算操作。
- **移码**
- 若要获得某个整型数据类型的移码表现形式,只需简单地把相应数值转换成补码后再对其首位进行翻转即可完成整个转变流程[^3]。
```python
def get_original_code(value, bits=8):
""" 获取给定十进制整数 value 的原码 """
if value >= 0:
binary_str = bin(value)[2:].zfill(bits)
else:
abs_value = abs(value)
sign_bit = '1'
magnitude_bits = format(abs_value, f'0{bits-1}b')
binary_str = sign_bit + magnitude_bits
return binary_str
def get_complement_one(code_string):
""" 将传入字符串 code_string 中每一位都反转并返回新的字符串"""
complemented_chars = ['1' if char == '0' else '0' for char in code_string]
return ''.join(complemented_chars)
def add_binary_strings(bin_a, bin_b):
""" 实现两个二进制串相加的功能函数 """
max_len = max(len(bin_a), len(bin_b))
# 补齐长度至最大宽度
a_padded = bin_a.zfill(max_len)
b_padded = bin_b.zfill(max_len)
result = []
carry = 0
for i in range(1, max_len + 1):
total = int(a_padded[-i]) + int(b_padded[-i]) + carry
if total >= 2:
carry = 1
remainder = str(total % 2)
else:
carry = 0
remainder = str(total)
result.append(remainder)
if carry != 0:
result.append(str(carry))
reversed_result = list(reversed(result))
joined_result = "".join(reversed_result).lstrip('0') or "0"
padded_final_result = joined_result.zfill(max_len)
return padded_final_result
def get_inverse_code(original_code):
""" 根据输入参数 original_code 来决定是否需要改变符号位之外的部分,并据此生成对应的一组新字符序列 """
if original_code.startswith('-'):
inverse_without_sign = get_complement_one(original_code[1:])
final_inverse = '-' + inverse_without_sign
elif original_code.startswith('+'):
final_inverse = '+' + original_code[1:]
return final_inverse.lstrip('+-')
def get_two_s_complement(inverse_code):
""" 接收由 get_inverse_code 函数产生的逆向编码 inverse_code 并在此基础上进一步加工以得出目标对象所代表的那个特定版本下的补充形态 """
positive_part = inverse_code.replace('-', '')
incremented_value = add_binary_strings(positive_part, '1')
if inverse_code.startswith('-'):
two_s_comp_with_sign = '-'+incremented_value
else:
two_s_comp_with_sign = '+'+incremented_value
return two_s_comp_with_sign.strip('+')
def convert_to_offset_binary(two_s_complement):
""" 把接收到的数据项 two_s_complement 进行必要的调整使之成为偏置二进制格式 """
without_sign = two_s_complement.removeprefix('-').removeprefix('+')
flipped_first_bit = ('0' if without_sign[0]=='1' else '1')+without_sign[1:]
offset_binary_representation = flipped_first_bit
return offset_binary_representation
value_example_positive = 5
original_pos = get_original_code(value_example_positive)
inverse_pos = get_inverse_code(f"+{original_pos}")
two_s_pos = get_two_s_complement(f"-{inverse_pos}")
print(f"Positive Value Example ({value_example_positive}):")
print(f"\tOriginal Code:\t\t {original_pos}\n\tInverse Code:\t\t {-inverse_pos}\n\tTwo's Complement:\t {two_s_pos}")
value_example_negative=-9
original_neg=get_original_code(value_example_negative)
inverse_neg=get_inverse_code(original_neg)
two_s_neg=get_two_s_complement(inverse_neg)
offset_binary_neg=convert_to_offset_binary(two_s_neg)
print("\nNegative Value Example (-9):")
print(f"\tOriginal Code:\t\t {original_neg}\n\tInverse Code:\t\t {inverse_neg}\n\tTwo's Complement:\t {two_s_neg}\n\tOffset Binary (Move Code):\t {offset_binary_neg}")
```
阅读全文
相关推荐















