原码、反码、补码的快速学习

原码、反码、补码

  • [1. 引言](#1. 引言)
  • [2. 原码、反码、补码](#2. 原码、反码、补码)
    • [2.1 原码](#2.1 原码)
    • [2.2 反码](#2.2 反码)
    • [2.3 补码](#2.3 补码)
  • 原反补的范围
  • 总结

1. 引言

本篇适合没什么计算机基础的新手,快速入门上手,内容不会讲的很详细

计算机能理解的只有二进制,也就是0和1,为了更好的处理负数的问题,引入了符号位。

以八位二进制数为例,用计算机的最高位(即左边第一位)记为符号位。

其中0 为正数的符号位,1为负数的符号位,也可以和数学对应的记一下:0相当于数学中的正号,1相当于数学中的负号。

2. 原码、反码、补码

为了更好的学习原码、反码和补码,这边我们用四个十进制数字来举例,这四个数字分别是:

6 -5 -127 127

2.1 原码

原码很好理解,就是将这几个十进制数字都转换成八位二进制数字,不足的向前面补0。

首先对这几个数字的正负性进行判断。

6为正数,所以符号位即最高位为0,将6转化二进制为110,其余空的补0,即⬇️

0000 0110

同理,剩下三位数字的原码为

-5

负数,符号位1,5的二进制是101

1000 0101

-127

1111 1111

127

0111 1111

2.2 反码

在使用原码时,我们也存在弊端,在进行加法运算时,(-1)+1的结果为0,在使用原码进行计算时,人为计算会很快出现答案,但对于计算机来说,还需要单独处理符号位,计算会变得复杂。

因此,为了方便进行负数的运算,引入了反码的概念。

反码的规则是:

正数的反码=原码

负数的反码:第一位(首位)符号位不变,其它位取反,即0取1,1取0。

如:

-5的原码为 1000 0101

其补码为 1111 1010

6为正数,即其反码=原码

0000 0110

-127

1111 1111

127

0111 1111

2.3 补码

上述无论是原码还是反码都存在一个问题,关于0的表述。

在原码中,0000 0000和1000 0000都表示0,在反码中0000 0000 和1111 1111都表示0,即+0和-0表述的问题。

为了确保0的唯一性,引入了补码的概念。

正数的补码等于其原码;负数的补码等于其反码+1,原来的-0的反码为1111 1111,它的补码为0000 0000。

补充:这里反码+1的结果应该为1 0000 0000,但存储是以一字节即八位二进制数存储,所以这里的1会直接溢出(这边对溢出不进行详细介绍),即-0的补码为0000 0000,这样以来+0和-0都指向了唯一编码 0000 0000。

这边就不继续进行举例了,可以使用该网站进行查看原反补在线网站

因此负数的补码还多了一位,即1000 0000,符号位为1,因此这个数为负数,这里规定1000 0000为-128。

原反补的范围

因为在关于0的表述中,原码和反码都存在着两个不同的编码指向同一具体数值(即0),8位二进制数一共可以表达出256种可能,这边关于0的表述占了一位,因此原码和反码的表示范围为 -127~127

补码的表示范围:-128~127

总结

正数的原码反码和补码是一样的,即正数的原码=反码=补码;

负数的反码:除符号位外其余位取反;

负数的补码:反码+1。

原码、反码范围:-127~127

补码范围:-128~127

相关推荐
sxlishaobin2 小时前
Maven Setting详解
java·学习·maven
每月一号准时摆烂2 小时前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记
老吴的商业笔记4 小时前
GEO: 杭州主要GEO优化系统公司大全(11月)
其他
柳鲲鹏1 天前
内斗学概论:43、平级内斗
笔记
星恒随风1 天前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
li星野1 天前
相位补偿学习记录:把被颅骨“打乱“的声波重新对齐
学习
Z21-X1 天前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
red_redemption1 天前
自由学习记录(230)
学习
晓梦林1 天前
BUUCTF-菜刀流量-MISC-学习笔记
笔记·学习
Godspeed Zhao2 天前
从零开始学AI25——无监督学习之层次聚类
学习·机器学习·聚类