补码 订阅
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 [1]  。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 [2]  。 展开全文
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 [1]  。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 [2]  。
信息
外文名
two's complement representation
作    用
存储数值
所属领域
计算机
中文名
补码
补码概念引入
在介绍补码概念之前,先介绍一下“模”的概念:“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。如:时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是 ,模= .“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算 [3]  。假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。若用一般公式可表示为:a-b=a-b+mod=a+mod-b。对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丢失。又回到了 00000000,所以8位二进制系统的模为 。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码 [3]  。
收起全文
精华内容
参与话题
问答
  • 补码

    千次阅读 2018-08-13 11:50:38
    补码是 00 00 00 00; -0的原码是80 00 00 00;反码是 FFFFFFFF;补码是 00 00 00 00; 用补码表示时,+0和-0是相同的,符合正常认知。 二、 解释 2.1、 基础 由此引出计算机中补码的表示规则:正数和零暂不讨论...

    一、  引言

    +0的原码是00 00 00 00;反码是 00 00 00 00;补码是 00 00 00 00;

    -0的原码是80 00 00 00;反码是 FF FF FF FF;补码是 00 00 00 00;

    补码表示时,+0和-0是相同的,符合正常认知。

    二、  解释

    2.1、  基础

    由此引出计算机中补码的表示规则:正数和零暂不讨论,需要额外注意负数的转换规则。

    对于负数进行探讨:

    原码 -> 补码  符号位不变,按位取反后+1;

    补码 -> 原码  符号位不变,-1后按位取反;

    以8位二进制来表示有符号数为例,-128的补码是0x10,按照补码转换成原码的规则,没有办法保证在符号位不变的前提下,得出原码。所以我们得到一个结论:

    最小负数只有补码,不存在原码和反码

    2.2、  补充

    容易与单目运算符~(取反运算符)和-(求补运算符)混淆。下面再举一个例子,对于4位二进制表示的有符号数:

    x = -4;(运算时都是以补码的形式参与运算)。

    其原码为1100;反码为1011;补码为1100;

    如果对x进行求补运算(每一位取反再+1),-x = ~x + 1;即0011+0001=0100(4)。

    从上述例子我们可以看到:x的补码是1100;对x进行求补的结果是0100,这两者是不一样的。

    2.3、  实例 

    int i=-2147483648;

    (k为二进制整数可表示的状态有2^k种。负数有2^(k-1)个,正数和0共有2^(k-1)个。int类型占4个字节,负数有2^31个,最小负数就是-2^31=-2147483648。)

    i 的补码为80 00 00 00;-1的补码为ff ff ff ff;

    -i-1的结果是 ???(-i)+(-1) => i的求补结果和1的求补结果相加;

    -i = ~i+1  =>  7f ff ff ff + 00 00 00 01 = 80 00 00 00;

    -1 = ~1+1  =>  ff ff ff fe + 00 00 00 01 = ff ff ff ff;

    相加为7f ff ff ff = 2147483647。

    2.4、  代码验证

    #include<stdio.h>
    #define INT_MIN     (-2147483647 - 1) 
    int main()
    {
    	int i = INT_MIN;
    	printf("%d", -i - 1);
    	return 0;
    }

     说明:代码中-2147483648要以宏的形式间接给出的原因参见errorC4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

    运行结果

     

    展开全文
  • 补码补码

    千次阅读 多人点赞 2016-05-26 14:05:11
    哈哈,每次看到补码的问题,总要再去翻看一下原理,每次都要搜索,好累啊,我决定自己总结一遍,下次只看自己的笔记。瓦咔咔。。。 --------------------------------切入正题 计算机中的符号数有三种表示方法...

    哈哈,每次看到补码的问题,总要再去翻看一下原理,每次都要搜索,好累啊,我决定自己总结一遍,下次只看自己的笔记。瓦咔咔。。。


    --------------------------------切入正题

    计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

    首先我们要知道计算机系统中存储数值时候使用补码表示。因为使用补码可以将符号位和数值位统一处理。此外补码和原码的换算是一样的,即补码的补码就是原码喽。

    一、正数的补码和原码相同

    例如+9 原码0000 1001 ,其补码还是0000 1001


    二、负数的补码是将其二进制正数取反(包括符号位和数值位)加一

    例如-5正数0000 0101 -->所有位取反 1111 1010 --->加一1111 1011

    PS:记得大学上课时候,老师讲过一个简单求负数的补码方法,首先符号位不参与运算,因为为负数,故符号位肯定为1,其余的数值位,从右往左遇到第一个1不变其余全部取反。故-5就是将1_000 0101 从右遇到的第一个1不变,其余取反。即为1_111 1011

    展开全文
  • 本文帮助理解,Java中原码反码补码的原理 1:原码反码补码,基础概念和计算方法 对于一个数,计算机需要使用一定的编码方式进行存储。原码反码补码是计算机存储一个具体数字的编码方式。 原码: 第一位表示符号...

    本文帮助理解,Java中原码反码补码的原理

    1:原码反码补码,基础概念和计算方法

    对于一个数,计算机需要使用一定的编码方式进行存储。原码反码补码是计算机存储一个具体数字的编码方式。

    原码:

    第一位表示符号位,其余位表示真值

    [+1]原 = 0000 0001

    [-1]原  = 1000 0001

    反码:

    正数的反码跟原码相等

    反码计算:在符号位不变的基础上,其余各位取反

     

    补码:

    正数的补码跟原码相等

    补码计算:在反码的基础上,最后加1

     

    2:为什么要使用原码反码补码

    1:利用反码和补码能将符号位带入计算(简化计算机门电路的设计,利用加法运算代替减法运算 1 - 1 = 1 + (-1) )

    // 利用反码进行计算

    1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

     

    // 利用补码进行计算,可以解决反码中的 -0的问题

    1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

    2:意外收获,利用补码进行计算 ,可以表示 -128(注意:-128没有反码和原码表示)

    (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

           因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31 - 1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

     

    3:理解一些现象

    利用补码来进行计算,可以推算出下面的等式成立

    Integer.MAX_VALUE + 1 = Integer.MIN_VALUE   
    Integer.MIN_VALUE - 1 = Iegnter.MAX_VALUE 

     

    4:原码反码补码深入理解

    计算机巧妙的把符号位参与到运算中,并且把减法变成加法。

    把钟表想象成一个1位的12进制数,如果当前时间是6点,我希望将时间设置成4点,有如下的操作可以达到目的

    1:往回拨2h   6 -2 = 4

    2:往前拨10h  (6 + 10)mod 12 = 4

    3:往前拨 10 + 12 = 22h    (6 + 22) mod 12 = 4

    从上面可以看出,钟表往回拨(减法)的结果可以用往前拨(加法)来代替

     

    4.1:同余的概念

    两个整数a,b,若他们除以整数m所得的余数相等,则称a,b对于模m同余,记作 a = b(mod m)。读做a与b关于模m同余

    eg:4 , 16 , 28 关于模12同余

    4 mod 12 =4

    16 mod 12 = 4

    28 mod 12 = 4

    4.2:负数取模

    eg:

    -3 mod 2 = -3  - 2 * (-3/2)

                   = -3 - 2 * (-2)

                   = -3 + 4 = 1

    4.3:开始证明

    (-2) mod 12 = 10

    10 mod 12 = 10      -2 和 10是同余的

    线形运算定理:

    如果a ≡ b (mod m),c ≡ d (mod m) 那么:

    (1)a ± c ≡ b ± d (mod m)

    (2)a * c ≡ b * d (mod m)

    如果想看这个定理的证明, 请看:http://baike.baidu.com/view/79282.htm  (同余定理)

        现在我们为一个负数,找到了它的正数同余数,7 -2 ≡ 7 + 10 (mod 12)  即计算结果的余数相等

    下面回到二进制的问题上,看一下 2 - 1 = 1 的问题

    2-1=2+(-1) = [0000 0010]原 + [1000 0001]原= [0000 0010]反 + [1111 1110]反

    先到这一步, -1的反码表示是1111 1110. 如果这里将[1111 1110]认为是原码, 则[1111 1110]原 = -126, 这里将符号位除去, 即认为是126.

    发现有如下规律:

    (-1) mod 127 = 126

    126 mod 127 = 126

    即:

    (-1) ≡ 126 (mod 127)

    2-1 ≡ 2+126 (mod 127)

    2-1 与 2+126的余数结果是相同的! 而这个余数, 正式我们的期望的计算结果: 2-1=1

    所以说一个数的反码, 实际上是这个数对于一个模的同余数. 而这个模并不是我们的二进制, 而是所能表示的最大值! 这就和钟表一样, 转了一圈后总能找到在可表示范围内的一个正确的数值!

    而2+126很显然相当于钟表转过了一轮, 而因为符号位是参与计算的, 正好和溢出的最高位形成正确的运算结果.

    既然反码可以将减法变成加法, 那么现在计算机使用的补码呢? 为什么在反码的基础上加1, 还能得到正确的结果?

    2-1=2+(-1) = [0000 0010]原 + [1000 0001]原 = [0000 0010]补 + [1111 1111]补

    如果把[1111 1111]当成原码, 去除符号位, 则:

    [0111 1111]原 = 127

    其实, 在反码的基础上+1, 只是相当于增加了膜的值:

    (-1) mod 128 = 127

    127 mod 128 = 127

    2-1 ≡ 2+127 (mod 128)

    此时, 表盘相当于每128个刻度转一轮. 所以用补码表示的运算结果最小值和最大值应该是[-128, 128].

    但是由于0的特殊情况, 没有办法表示128, 所以补码的取值范围是[-128, 127]

     

     

     

    展开全文
  • 二进制 原码 反码 补码

    千次阅读 2019-12-23 17:56:15
    1、原码,反码和补码概念 正数:原码、反码、补码相同; 以123为例: 原码:01111011 反码:01111011 补码:01111011 负数的原码:为取绝对值的数转二进制,然后符号位加一; 负数的反码:对该数的原码除符号...

    1、原码,反码和补码概念

    正数:原码、反码、补码相同;

    以123为例:

    原码:01111011

    反码:01111011

    补码:01111011


    负数的原码:为取绝对值的数转二进制,然后符号位加一

    负数的反码:对该数的原码除符号位外,各位取反

    负数的补码:对该数的反码加1。--负数的补码即为负数的二进制数。

    以-123为例:

    原码:11111011,其中最高位1为符号位。

    反码:10000100

    补码:10000101


    2、负数二进制转十进制

    先计算反码:负数二进制码减一,即为反码;
    再计算原码:反码除符号位外,按位取反,即为原码;
    最后计算十进制数:除符号位外的原码转相应的十进制数后,加上负号。

    以-123为例:

    二进制:10000101
    反    码:10000100
    十进制:11111011(原码),去掉符号位原码:1111011,转十进制为:123,加上负号:-123。

    展开全文
  • 原码反码补码

    2019-04-23 21:24:55
    原码反码补码

空空如也

1 2 3 4 5 ... 20
收藏数 17,735
精华内容 7,094
关键字:

补码