原码,补码,反码的计算方式

本文介绍如何使用8位二进制数表示正数和负数,并详细解释了原码、补码和反码的概念及计算方法。通过一个具体例子帮助读者更好地理解这些编码方式。

8位二进制表示一个数,第一位是符号位,正数为 0,负数 为 1

原码,补码,反码的计算方式总结。

这里写图片描述

例子

这里写图片描述

### 原码补码反码和移码的计算方法 #### 定义与用途 在计算机系统中,为了有效地处理正负数以及简化硬件设计,引入了四种不同的编码方式原码反码补码和移码[^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}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值