前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >【原码、反码、补码】小白看完都呲大牙

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

作者头像
用户11328191
发布于 2024-10-23 06:36:24
发布于 2024-10-23 06:36:24
68800
代码可运行
举报
文章被收录于专栏:li_waitli_wait
运行总次数:0
代码可运行

前言:

在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.程序有问题
代码语言:javascript
代码运行次数:0
复制
#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只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

只有一点小小归纳,希望能帮到大家! 如果大家发现知识点错误的话,请帮忙指出,十分感谢!! 也请大家帮忙点赞、评论,这将督促我前行,大家一起加油!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验