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

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

前言:  

       在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只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

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

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

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


目录
相关文章
|
6月前
|
存储
一分钟了解什么是原码-反码-补码
一分钟了解什么是原码-反码-补码
|
6月前
|
程序员
程序员必知:原码、反码、补码和移码详解
程序员必知:原码、反码、补码和移码详解
105 0
|
存储
寒假刷题之原码/反码/补码
寒假刷题之原码/反码/补码
78 0
原码补码反码
原码补码反码
138 0
|
存储
[软考]之原码、反码、补码和移码
[软考]之原码、反码、补码和移码
122 0
|
Java
进制转换、原码、反码、补码及位运算详解
进制转换、原码、反码、补码及位运算的简单示例
669 1
进制转换、原码、反码、补码及位运算详解
|
存储
一篇轻松带你Carry原码、反码、补码(建议收藏)
一篇轻松带你Carry原码、反码、补码(建议收藏)
223 0
原码、反码、补码
原码、反码、补码区别
169 0
|
Go 开发者
原码 反码 补码|学习笔记
快速学习原码 反码 补码。
116 0
原码、反码、补码知识详细讲解(超细致,建议收藏)(3)
原码、反码、补码知识详细讲解(超细致,建议收藏)(3)
216 0
原码、反码、补码知识详细讲解(超细致,建议收藏)(3)