【原码、反码、补码】小白看完都呲大牙

简介: 【原码、反码、补码】小白看完都呲大牙

前言:  

       在32为机器上,计算机存储数据是用32个比特位来存储数据的,而一个比特位可以存储一个二进制位的0或1。那么在64位机器上,存储数据就是用64个比特位来存储数据。所以即使是一个数字,在32位机器上,也要用32个比特位(二进制位)来存储。在本篇博文中,以32位机器为例。

规则:

整数的2进制表示方法有三种,即原码、反码和补码

有符号整数的三种表示方法中,包括符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。

符号位都是用0表示“正”,用1表示“负”。

注:符号位可以参与加减运算

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

负整数的三种表示方法各不相同。

  • 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
  • 反码:将原码的符号位不变,其他位依次按位取反(该二进制位是0,就改写成1;是1则改写成0)就可以得到反码。
  • 补码:反码+1就得到补码。
  • 补码得到原码也是可以使用:取反,+1或者-1,取反的操作。

       如果你第一次接触原码、反码、补码,是不是觉得补码得到原码的第一种方法很容易理解就是:补码-1得到反码,得到的反码除符号位外按位取反得到就是原码。但不能一下就接受第二种方法?那我就在这里举个例子,帮助大家理解吧!

我们先写出-1的原反补:

-1的原码:10000000000000000000000000000001

-1的反码:11111111111111111111111111111110

-1的补码:11111111111111111111111111111111

开始补码 取反、+1

补码取反:100000000000000000000000000000000

+1:          100000000000000000000000000000001

取反、+1得到的结果与原码一样,所以这种方法也是行得通的。

小提示:可以记住-1的补码二进制位全是1,因为我们经常会遇到它哦!

对于整数来说:在内存中,数据存放其实存放的是它的补码;数据的计算也是使用它的补码。

为什么呢?

我们举例说明。

计算1 - 1

CPU只有加法器,所以相当于1+(-1):

1的原码,反码,补码:00000000000000000000000000000001

-1的原码:10000000000000000000000000000001

-1的反码:11111111111111111111111111111110

-1的补码:11111111111111111111111111111111

若使用原码进行计算结果为:10000000000000000000000000000010即-2但正确结果是0

而我们使用补码进行计算,结果为:100000000000000000000000000000000

可以看到+1之后就有33个二进制位了,但是32位机器存储数据是用32个比特位来存储的,所以我们要选择舍弃一位比特位,在这里我们丢弃最高位

所以,补码+1的结果是:00000000000000000000000000000000即0,答案正确

小小练习:下面代码的结果是()

  • A.>
  • B.<
  • C.不输出
  • D.程序有问题
#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

解析:答案是A

C语言中,0为假,非0即为真。

全局变量,没有给初始值时,编译其会默认将其初始化为0

i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧 i 自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A

这道题其实很隐蔽,真是虾仁猪心!!!

总结:

所以,在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

只有一点小小归纳,希望能帮到大家!

如果大家发现知识点错误的话,请帮忙指出,十分感谢!!

也请大家帮忙点赞、评论,这将督促我前行,大家一起加油!!!


目录
相关文章
|
存储 资源调度 Java
计算机基础(1)——计算机体系结构和组成
计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 在过去的几十年里,计算机科学经历了令人瞩目的飞速发展。经历了电子管、晶体管、集成电路的世代发展,体积越来越小、性能越来越强,为人类带来了巨大的便利和变革,下面我们来回顾计算机的发展历程。
3809 5
计算机基础(1)——计算机体系结构和组成
|
机器学习/深度学习 人工智能 算法
神经形态计算:模拟大脑的计算方式
【10月更文挑战第11天】神经形态计算作为一种新兴的计算范式,正以其独特的优势和广阔的应用前景吸引着越来越多的关注。通过模拟大脑的计算方式,神经形态计算不仅能够提高计算速度和能效,还能在处理复杂任务时展现出更高的智能水平。我们有理由相信,在未来的发展中,神经形态计算将为我们带来更多的惊喜和突破,引领我们进入一个全新的计算时代。
|
存储 数据采集 自然语言处理
使用大模型时,该如何避免虚假信息的生成和使用?
使用大模型时,该如何避免虚假信息的生成和使用?
1321 1
|
安全 Linux
Linux Centos通过mail向QQ邮箱发邮件
【8月更文挑战第20天】在 CentOS 上配置使用 `mail` 命令向 QQ 邮箱发送邮件涉及几个步骤。首先确保已安装 `mailx`;接着编辑 `/etc/mail.rc` 文件来配置发件信息,包括设置发件邮箱、SMTP 服务器及授权码。最后,通过 `echo` 命令结合 `mail` 发送邮件。需登录 QQ 邮箱开启 SMTP 服务并获取授权码用于安全验证。
895 3
|
存储
计算机基础(4)——原码、补码、反码
计算机为了区分数值的正负提出了符号位的设定,计算机用最高位存放符号,这个被称为符号位。正数的符号位为0, 负数的符号位为1。 例如,1的二进制表示形式为`0000 0001`,而-1的二进制表示形式为`1000 0001`。在计算机中,一个字节为8个位,最大值为0111 1111,十进制为127。最小值为1000 0000,十进制为-128。因此一个字节的取值范围为-128~127之间。
3294 4
|
机器学习/深度学习 人工智能 PyTorch
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
本文将系统阐述DPO的工作原理、实现机制,以及其与传统RLHF和SFT方法的本质区别。
1478 22
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
|
NoSQL 关系型数据库 Shell
Mongodb支持事务吗?
MongoDB 是一个非关系型数据库,最初不支持事务。4.0版本引入了多文档事务支持,确保跨多个文档的操作要么全部成功,要么全部失败回滚,保持数据一致性。从4.2版本起,分布式事务和多文档事务成为同义词,支持分片集群和副本集上的多文档操作。配置事务需开启副本集,并通过会话管理事务的提交与回滚。示例展示了如何在MongoDB Shell中使用事务进行多文档操作。
1383 11
一分钟了解什么是原码-反码-补码
一分钟了解什么是原码-反码-补码
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
|
缓存 运维 Docker
Docker清理磁盘空间
在日常运维当中,Docker会产生一些运行时的临时文件,我们需要定时的清理掉他们,不然将会对磁盘造成极大的压力。
718 0