二进制补码

-----------siwuxie095

   

   

   

   

   

1、概述

   

   

   

   

   

   

2、补码规则

   

   

如下:

   

1

   

   

   

2

   

   

   

   

四位二进制数对应的十进制数补码和非补码表:

   

二进制数

十进制数补码

十进制值

0000

0

0

0001

+1

1

0010

+2

2

0011

+3

3

0100

+4

4

0101

+5

5

0110

+6

6

0111

+7

7

1000

-8

8

1001

-7

9

1010

-6

10

1011

-5

11

1100

-4

12

1101

-3

13

1110

-2

14

1111

-1

15

   

   

   

   

   

3、为什么使用补码

   

   

   

   

   

   

   

4、补码运算的特征

   

   

   

   

   

   

   

   

   

5、补码运算的原理

   

   

   

   

   

   

   

小扩展:

   

正数的原码、反码、补码都相同

   

负数的反码是在原码的基础上,最高位(符号位)不变,其他位取反

   

负数的补码是在反码的基础上,再加 1

   

(也可以直接将此负数对应的正数原码,所有位取反再加 1

   

   

是指一个计量系统的计数范围,如时钟(计量范围:0~11,模=12)。

计算机也可以看做一个计量机器,它也有一个计量范围,即都存在一个 模。

   

模实质上是计量器产生溢出的量。它的值在计量器上表示不出来,计量器上

只能表示出模的余数(如时钟的模=12表示不出来,不在0~11中)

   

任何有模的计量器,均可化减法为加法运算(如时钟的顺逆拨动,当时针

10点,要拨到6点,可以顺拨 8,「10+8=12+6=6」也可以逆拨 4

10-4=6」,即在12为模的系统中,减4和加8的效果一样,凡是减4运算

都可以用加8代替,对模12而言,84互为补数)

   

在二进制中,正数和对应的负数相对于 2n来说,互为补数

〔即 模的二进制减去正数的二进制补码即为负数的二进制补码〕

   

   

   

另:负数补码的其他求法

   

1)负数补码 = 2n- 对应正数的补码

2)将对应正数的二进制补码进行比特反相运算,再将结果加1

3)先写出对应正数的二进制补码:

  • 先由最低比特开始找。
  • 若该比特为0,将补码对应比特填0,继续找下一比特(较高的比特)。
  • 若找到第一个为1的比特,将补码对应比特填1。
  • 将其余未转换的比特进行比特反相,将结果填入对应的补码。

       

       

       

       

    特别的数字:

    有二个数字的补码等于本身:一个是0,另一个为该比特可表示最大绝对值负数(即1000...)

       

       

       

    为什么补码能这么巧妙实现了正负数的加减运算?

       

    因为:指定n比特字长,那么就只有 2n个可能的值,加减法运算都存在

    上溢出与下溢出的情况,实际上都等价于模 2n 的加减法运算

       

    这对于n比特无符号整数类型或是n比特有符号整数类型都同样适用

       

       

       

       

       

    【made by siwuxie095】

转载于:https://www.cnblogs.com/siwuxie095/p/6531962.html

### 二进制补码的概念与计算方法 #### 补码的定义 在计算机中,补码用于表示带符号的二进制数。正数的补码与其原相同,而负数的补码是通过对其绝对值的反加1得到的。这种表示方法解决了反中零有两个表示的问题,并且使得加减法运算更加简便[^3]。 #### 补码的计算步骤 对于一个给定的十进制整数(包括正数和负数),其二进制补码可以通过以下方式计算: 1. **正数的补码**:直接将其转换为二进制形式即可,符号位为0。 2. **负数的补码**: - 首先将该负数的绝对值转换为二进制形式。 - 对二进制数逐位取反(即0变为1,1变为0)。 - 在取反后的结果上加1。 #### 示例计算 以下是一个具体的例子,展示如何计算二进制补码: - **十进制数:-5** 1. 将5转换为8位二进制:`00000101`。 2. 对二进制数逐位取反:`11111010`。 3. 在取反结果上加1:`11111011`。 因此,-5的8位二进制补码为`11111011`。 #### 代实现 以下是一个C++程序,用于输出任意整数的32位二进制补码表示: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long n; int a[32] = {}; scanf("%lld", &n); if (n < 0) { a[31] = 1; // 符号位设为1 n = 0 - n; // 取绝对值 } int i = 0; while (n) { a[i++] = n % 2; n /= 2; } if (a[31] == 1) { // 如果是负数 for (int i = 0; i < 31; i++) a[i] = 1 - a[i]; // 取反 int x = 1; for (int i = 0; i < 31; i++) { // 加1 a[i] = a[i] + x; x = a[i] / 2; a[i] = a[i] % 2; } } for (int i = 31; i >= 0; i--) printf("%d", a[i]); return 0; } ``` #### 补码的应用 补码不仅简化了加减法运算,还使得硬件设计更加高效。例如,在计算机中,两个数的减法可以通过将被减数与减数的补码相加来实现,从而避免了专门设计减法器的需要[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值