二进制补码以及为什么要使用补码

  1. 计算机系统的内部以二进制形式存储数据。
  2. 在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。

补码规则

  1. 在计算机系统中,数值一律用二进制的补码来存储。
  2. 二进制的最高位是符号位,0表示正数,1表示负数。
  3. 正数的值是其本身,负数的值是最高位(符号位)不变,其它位逐位取反,再加1。
  4. 两数相加,若最高位(符号位)有进位,则进位被舍弃。
    例如: 4位二进制补码中,5-3的结果是2

(1101)2 //2是二进制的意思
0010 //逐位取反
0011 // 加1
(1101)2 = -3

补码运算的特征

  1. 计算机中正数和负数的关系是取反加一。
    【示例】在四位二进制数中,已知3的二进制值是0011,若要求-3,则
    0011 3
    1100 逐位取反
    1101 +1
  2. 补码运算是封闭的: 运算结果保留在补码范围之内, 超范围就溢出。
    【示例】四位二进制的补码运算中,请计算5+4的结果。
    结果为:-7
  3. 4位二进制补码最多能表示24=16个数,数的范围是-8~7
  4. 8位二进制补码最多能表示28=256个数,数的范围是
    -128~127

补码运算的原理

“正数+负数=模”。
模:某种类型数据的总数,例如:
4位二进制数的模是24=16
8位二进制数的模是28=256

为什么要使用补码?

下面的故事都是我瞎编的~~
计算机专业的人你懂得,大家都不想重复造车轮。搞出来加法电路以后,就在大家一筹莫展想怎么搞个减法的电路的时候,我的女儿(好吧,我没有)拿着一道数学题找到了我,5+(-2)=?,我惊奇的发现,减法和加法之间似乎有着某种py交易。
所以我们是不是可以用加法电路就可以完成减法的运算呢?
每当老师上课的时候提出这种设问,答案往往是肯定的(23333)
咱们首先画个大饼,就是公司画给咱们的那种。
在这里插入图片描述
比如5-3=2。我们发现,5往后面退后3个格子就可以得到2这个结果,但是没有注意到的是,5往前面走7个格子也可以得到2这个结果,但是这个7和3有什么必然的联系吗?在这个饼里面他的模是10!3+7=模!
所以5-3=2在计算机的算法就应该是下面的过程:
(-3)2=011
(-3)=001
在这里插入图片描述
这里我们舍掉最高位就是结果2。实际上,因为这里是3位二进制数,110对应的10进制数为6,6+2=8,所以其实如果写成4个二进制数,就是
0101+1101=0010 ,8位二进制的话,就是00000101+11111101=10000010结果仍然是2

### 二进制补码的定义 二进制补码是一种在计算机系统中用于表示有符号整数的编码方式。对于一个 $ n $ 位的二进制数 $ N $,其补码定义为 $ 2^n - N $。这种表示方法使得负数可以直接参与加法运算,而不需要额外的硬件电路来处理减法或负数的加法。 例如,对于一个 8 位二进制数 $ N = 5 $,其二进制表示为 $ 00000101 $。根据补码的定义,$ -5 $ 的补码表示为: $$ 2^8 - 5 = 256 - 5 = 251 $$ 对应的二进制形式为 $ 11111011 $。这个二进制数并不是作为一个无符号整数来解释,而是作为 $ -5 $ 的补码表示形式[^1]。 ### 二进制补码的计算方法 二进制补码的计算可以通过以下步骤实现: 1. **确定二进制位数**:假设使用 $ n $ 位二进制数表示数值。 2. **计算正数的补码**:正数的补码与其原码相同。 3. **计算负数的补码**:负数的补码可以通过以下公式计算: $$ \text{补码} = 2^n - |N| $$ 其中 $ N $ 是负数的绝对值。 例如,计算 $ -5 $ 在 8 位二进制系统中的补码: - $ n = 8 $,因此 $ 2^8 = 256 $ - $ |N| = 5 $ - 补码为 $ 256 - 5 = 251 $,对应的二进制表示为 $ 11111011 $ 另一种计算负数补码的方法是: 1. 写出该负数绝对值的二进制表示。 2. 对每一位取反(即 0 变 1,1 变 0)。 3. 最后加 1。 以 $ -5 $ 为例: - 绝对值 $ 5 $ 的二进制表示为 $ 00000101 $ - 取反后得到 $ 11111010 $ - 加 1 后得到 $ 11111011 $ ### 二进制补码的作用 二进制补码在计算机系统中具有以下重要作用: 1. **简化算术运算**:使用补码表示法可以使得加法和减法操作使用相同的电路实现。减去一个数等价于加上这个数的补码。例如,$ 16 + (-8) $ 在 8 位系统中可以表示为 $ 00010000 + 11111000 = 00001000 $,即 $ 8 $[^4]。 2. **统一的零表示**:在补码表示法中,0 只有一种表示方式(即所有位均为 0),避免了原码和反码中存在 $ +0 $ 和 $ -0 $ 两种不同表示的问题。 3. **消除二义性**:与早期使用的反码、符号加绝对值等方法相比,补码表示法在计算效率和逻辑一致性上更具优势,因此被广泛采用[^3]。 ### 代码示例 以下是一个简单的 Python 函数,用于计算一个整数的 $ n $ 位补码表示: ```python def twos_complement(n_bits, value): if value >= 0: return format(value, '0{}b'.format(n_bits)) else: return format((1 << n_bits) + value, '0{}b'.format(n_bits)) # 示例:计算 -5 的 8 位补码 print(twos_complement(8, -5)) # 输出: 11111011 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值