原码,补码,反码,偏移码的区别
时间: 2024-09-10 15:14:55 浏览: 215
原码、补码、反码和偏移码是计算机中用于表示有符号整数的不同编码方式。
1. 原码(True Form):原码是直观的表示方法,将一个数值直接转换为二进制形式。在原码表示法中,通常最高位用作符号位,其中0表示正数,1表示负数。其余位表示数值的绝对值。例如,假设我们用8位二进制表示数,那么+5表示为00000101,-5表示为10000101。
2. 反码(Ones' Complement):反码用于简化加法和减法运算,特别是在负数的表示上。正数的反码与其原码相同,负数的反码则是将其原码除符号位外的所有位取反(0变1,1变0)。例如,+5的反码还是00000101,而-5的反码则是11111010。
3. 补码(Two's Complement):补码也是用于简化二进制运算的编码方式,它是目前计算机系统中最常用的表示方法。正数的补码与其原码相同,而负数的补码是其反码加1。以8位二进制为例,+5的补码是00000101,-5的补码则是11111011。
4. 偏移码(Offset Binary)或称为二进制编码的偏移表示法(Excess Code),也称作Excess-K或Excess-偏移量编码。它是将二进制数的原码与一个固定的偏移量相加得到的编码。常用的偏移量是2^(n-1),其中n是位数。例如,对于8位偏移码,偏移量是2^(8-1)=128。因此,+5的偏移码是0000101 + 10000000 = 10000101,而-5的偏移码是其原码加上128,即00000101 + 10000000 = 10000111。
相关问题
原码 补码 反码 移码
这四种编码方式都是用来表示二进制数的,常用于计算机系统中。它们的应用场景主要涉及到数字表示、算术运算和数据存储等方面。
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}")
```
阅读全文
相关推荐
















