问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

二进制中为什么负数是正数取反再加一

创作时间:
作者:
@小白创作中心

二进制中为什么负数是正数取反再加一

引用
1
来源
1.
https://www.cnblogs.com/marsggbo/p/18281374

在计算机科学中,负数在二进制中的表示方式一直是一个令人困惑的问题。为什么负数要用正数取反再加一的方式表示?这个问题的答案涉及到计算机科学中一些最基本的设计思想。本文将从多个角度解释这个看似简单但背后蕴含深刻设计思想的概念。

二进制中的负数表示有一个重要的概念是补码,它是由对应正数二进制取反后再加 1 得到的。但是经常忘记为什么要这么表示,这里结合 chatgpt 解释做个简单的总结。

补码(Two's Complement)设计的逻辑来自于简化和统一计算机中有符号数的表示和运算。其设计逻辑可以追溯到计算机科学中的一些基本需求和目标。以下是补码设计逻辑的详细解释:

1. 有符号数的表示

目标 : 在计算机中,需要一种方法来表示正数和负数,同时要确保运算的简便性和一致性。

2. 符号位的使用

思路 : 使用最高位(最左边一位)作为符号位。0表示正数,1表示负数。这是因为使用最高位作为符号位可以直接决定数的正负,同时剩余的位可以用于表示数值部分。

3. 简化运算

需求 : 希望计算机能够使用相同的电路(主要是加法器)来处理加法和减法。

实现 :

  • 对于加法,直接进行二进制加法。

  • 对于减法,将减法转换为加法,通过加上一个负数来实现。

4. 负数的表示

挑战 : 如何表示负数使得上述需求能够被满足?

这里我们可以假设给定一个正数,例如 5 的8位二进制是 0000 0101,那么我们该如何设计-5 呢?

很显然,最重要想实现的目的是 5+-5=0,也就是 0000 0101 + x = 0000 0000, 手动算一下减法,x= 1111 1011。观察一下规律你会发现,x 其实就是 0000 0101取反再加 1。

整理一下,如下:

补码的引入 :

  • 按位取反加1 : 补码的核心思想是,将一个数的负数表示为该数的按位取反再加1。

例如,对于8位系统中的数字:

  • 正数 5 的二进制表示是 0000 0101。

  • 负数 -5 的表示过程是:

    1. 将 5 的二进制按位取反:1111 1010

    2. 加1:1111 1011

      因此,-5 的补码表示是 1111 1011。

5. 运算一致性

验证 : 通过补码表示,负数可以直接参与加法运算,而无需额外的减法电路。

例如,计算 5 + (-5):

  • 5 的二进制表示是 00000101

  • -5 的补码表示是 11111011

二者相加:

00000101
+ 11111011
---
100000000  (由于是8位系统,只取低8位,结果为 00000000)

结果为 00000000,表示0,运算正确。

6. 统一零的表示

优势 : 使用补码表示法,零只有一种表示形式,即 00000000,这简化了零的处理逻辑,避免了符号-绝对值表示法中正零和负零的问题。

7. 溢出检测简化

溢出检测 : 在补码表示法中,溢出可以通过简单的逻辑操作检测到。例如:

这可以通过检查结果的符号位来实现。

设计逻辑总结

补码的设计逻辑旨在简化和统一计算机中有符号数的表示和运算。其主要优势包括:

  • 符号位的直观使用

  • 负数的补码表示使加法和减法运算一致

  • 零的唯一表示形式

  • 简化的溢出检测

通过这些设计,补码有效地解决了在计算机中处理有符号数的各种挑战,成为现代计算机系统中广泛采用的表示方法。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号