原码、反码、补码详解

合集下载

原码、反码、补码

原码、反码、补码

原码、反码、补码⼀、什么是原码、反码、补码原码:将⼀个整数,转换成⼆进制,就是其原码。

如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每⼀位取反。

如单字节的5的反码为:0000 0101;-5的反码为1111 1010。

补码:正数的补码就是其原码;负数的反码+1就是补码。

如单字节的5的补码为:0000 0101;-5的补码为1111 1011。

⼆、为什么要有这三类码计算机只能识别0和1,使⽤的是⼆进制。

⽽在⽇常⽣活中⼈们使⽤的是⼗进制,并且我们⽤的数值有正负之分。

于是在计算机中就⽤⼀个数的最⾼位存放符号(0为正,1为负)。

这就是机器数的原码了。

有了数值的表⽰⽅法就可以对数进⾏算术运算,但是很快就发现⽤带符号位的原码进⾏乘除运算时结果正确,⽽在加减运算的时候就出现了问题,如下:假设字长为8bits(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 显然不正确。

因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数⾝上。

对除符号位外的其余各位逐位取反就产⽣了反码。

反码的取值空间和原码相同且⼀⼀对应。

下⾯是反码的减法运算:(1)10 - (1)10 = (1)10 + (-1)10= (0)10(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有问题。

(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正确。

问题出现在(+0)和(-0)上,在⼈们的计算概念中零是没有正负之分的。

(印度⼈⾸先将零作为标记并放⼊运算之中,包含有零号的印度数学和⼗进制计数对⼈类⽂明的贡献极⼤)。

原码、反码与补码知识讲解

原码、反码与补码知识讲解

原码、反码与补码知识讲解2.2 原码、反码与补码在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。

所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

由此可见,这三种表示法中,关键是负数的表示方式不一样。

2.2.1 正负数表示、定点数与浮点数在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。

规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。

2.2.2 原码原码表示法是定点数的一种简单的表示法。

用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。

原码表示法又称为符号-数值表示法。

1. 小数原码表示法设有一数为x,则原码表示可记作[x]原(下标表示)。

例如,X1= +1010110 ;X2= -1001010原码表示数的范围与二进制位数有关。

设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下:例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。

根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。

2. 整数原码表示法整数原码的定义如下:例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。

原码、反码、补码的定义

原码、反码、补码的定义

原码、反码、补码的定义所有的负数的反码等于原码各位取反;补码等于反码加一.十六进制也是先化成2进制的在化补码。

补码的用途是让机器学会减法运算的。

应为所有的处理器是电路做的,电路其实只是加法器,只能做加法。

如何能让电脑做减法呢,就用补码啊。

减去一个数就等于加上她的补码。

一、原码、反码、补码的定义1、原码的定义①小数原码的定义[X]原=X 0≤X<1 1-X-1<X≤0例如:X=+0.1011,[X]原=01011 X=-0.1011[X]原=11011②整数原码的定义[X]原=X 0≤X<2n 2n-X-2n<X≤0 2、补码的定义①小数补码的定义[X]补=X 0≤X<1 2+X-1≤X<0例如:X=+0.1011,[X]补=01011 X=-0.1011,[X]补=10101②整数补码的定义[X]补=X 0≤X<2n 2n+1+X-2n≤X<0 3、反码的定义①小数反码的定义[X]反=X 0≤X<1 2-2n-1-X-1<X≤0例如:X=+0.1011[X]反=01011 X=-0.1011[X]反=10100②整数反码的定义[X]反=X 0≤X<2n 2n+1-1-X-2n<X≤0 4.移码:移码只用于表示浮点数的阶码,所以只用于整数。

①移码的定义:设由1位符号位和n位数值位组成的阶码,则[X]移=2n+X-2n≤X≤2n例如:X=+1011[X]移=11011符号位"1"表示正号X=-1011[X]移=00101符号位"0"表示负号②移码与补码的关系:[X]移与[X]补的关系是符号位互为反码,例如:X=+1011[X]移=11011[X]补=01011 X=-1011[X]移=00101[X]补=10101③移码运算应注意的问题:◎对移码运算的结果需要加以修正,修正量为2n,即对结果的符号位取反后才是移码形式的正确结果。

简述原码、补码和反码的含义

简述原码、补码和反码的含义

简述原码、补码和反码的含义原码、补码和反码是用于表示有符号整数的三种不同的编码方式。

它们在计算机系统中用于处理带符号数的溢出和运算问题。

1. 原码(Sign and Magnitude):
•原码是最直观的一种表示方法,其中整数的符号用最高位表示(0表示正,1表示负),其余位表示数值的绝对值。

•例如,+5的8位原码表示为 00000101,-5表示为 10000101。

2. 反码(Ones' Complement):
•反码的符号位与原码相同,但是数值位取反。

即,正数的反码与原码相同,负数的反码是将其原码中的每一位取反。

•例如,+5的8位反码表示为 00000101,-5的8位反码表示为11111010。

3. 补码(Two's Complement):
•补码是计算机系统中最常用的表示方法,它解决了反码中的0有两个表示的问题。

•正数的补码与原码相同,而负数的补码是其反码加1。

•例如,+5的8位补码表示为 00000101,-5的8位补码表示为11111011。

这三种表示方法中,原码、反码和补码都有其优缺点。

补码在进行加减运算时更为方便,而且只有一种表示0的方式,因此在计算机中广泛应用。

在补码表示中,正数、负数的加法和减法可以通过相同的硬件电路实现,简化了计算机的设计。

原码,反码,补码,移码

原码,反码,补码,移码

反码在计算机内,定点数有3种表示法:原码、反码和补码。

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

1、原码、反码和补码的表示方法(1)原码:在数值前直接加一符号位的表示法。

例如:符号位数值位[+7]原= 0 0000111 B[-7]原= 1 0000111 B注意:a. 数0的原码有两种形式:[+0]原=00000000B [-0]原=10000000Bb. 8位二进制原码的表示范围:-127~+127(2)反码:正数:正数的反码与原码相同。

负数:负数的反码,符号位为“1”,数值部分按位取反。

例如:符号位数值位[+7]反= 0 0000111 B[-7]反= 1 1111000 B注意:a. 数0的反码也有两种形式,即[+0]反=00000000B[- 0]反=11111111Bb. 8位二进制反码的表示范围:-127~+127(3)补码的表示方法1)模的概念:把一个计量单位称之为模或模数。

例如,时钟是以12进制进行计数循环的,即以12为模。

在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。

14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。

从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。

因此,在模12的前提下,-10可映射为+2。

由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。

原码,反码,补码及运算

原码,反码,补码及运算

原码,反码,补码及运算一、定义1.原码正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。

用这样的表示方法得到的就是数的原码。

【基准2.13】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011y=+1011011[y]原码=11011011[+1]原码=00000001[-1]原码=10000001[+127]原码=01111111[-127]原码=11111111原码则表示的整数范围就是:-(2n-1-1)~+(2n-1-1),其中n为机器字长。

则:8十一位二进制原码则表示的整数范围就是-127~+12716十一位二进制原码则表示的整数范围就是-32767~+327672.反码对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。

【基准2.14】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011[x]反码=01011011y=-1011011[y]原码=11011011[y]反码=10100100[+1]反码=00000001[-1]反码=11111110[+127]反码=01111111[-127]反码=10000000负数的反码与负数的原码存有非常大的区别,反码通常用做谋补码过程中的中间形式。

反码则表示的整数范围与原码相同。

3.补码正数的补码与其原码相同,负数的补码为其反码在最低位加1。

导入补码以后,计算机中的以此类推运算都可以统一化成补码的乘法运算,其符号位也参予运算。

【例2.15】(1)x=+1011011(2)y=-1011011(1)根据定义存有:[x]原码=01011011[x]补码=01011011(2)根据定义存有:[y]原码=11011011[y]反码=10100100[y]补码=10100101补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。

原码反码补码例题详解

原码反码补码例题详解

原码反码补码例题详解原码、反码和补码是计算机中表示有符号整数的三种常用方式。

下面我将从多个角度对原码、反码和补码进行详解。

首先,我们先来了解一下原码。

原码是最简单的表示方法,它的规则很简单,用最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。

例如,8位二进制数中,+3的原码是00000011,-3的原码是10000011。

接下来是反码。

反码是在原码的基础上,对负数进行取反操作。

即,正数的反码和原码相同,而负数的反码是符号位不变,其余位取反。

例如,+3的反码和原码相同,都是00000011,-3的反码是11111100。

最后是补码。

补码是在反码的基础上,再加1。

正数的补码和原码相同,而负数的补码是反码加1。

补码的好处是可以将加法运算转化为简单的二进制运算。

例如,+3的补码和原码相同,都是00000011,-3的补码是11111101。

原码、反码和补码的转换可以通过以下步骤完成:1. 原码转反码,对于负数,符号位不变,其余位取反。

2. 反码转补码,对于负数,取反码后再加1。

下面我们通过一个例题来说明原码、反码和补码的转换过程。

例题,将十进制数-5转换为8位二进制的原码、反码和补码。

解答:1. 原码,将5的绝对值转换为二进制,得到00000101,然后将最高位改为1,得到10000101,即-5的原码。

2. 反码,对于负数,符号位不变,其余位取反。

所以-5的反码为11111010。

3. 补码,对于负数,取反码后再加1。

所以-5的补码为11111011。

综上所述,-5的8位二进制的原码、反码和补码分别为10000101、11111010和11111011。

总结起来,原码是最直观的表示方式,反码是在原码的基础上对负数进行取反操作,而补码是在反码的基础上再加1。

补码的优势在于可以简化有符号数的加法运算。

这就是原码、反码和补码的例题详解。

C语言的原码,反码,补码

C语言的原码,反码,补码

C语⾔的原码,反码,补码1)原码表⽰原码表⽰法是机器数的⼀种简单的表⽰法。

其符号位⽤0表⽰正号,⽤:表⽰负号,数值⼀般⽤⼆进制形式表⽰。

设有⼀数为x,则原码表⽰可记作[x]原。

例如,X1= +1010110X2= ⼀1001010其原码记作:[X1]原=[+1010110]原=01010110[X2]原=[-1001010]原=11001010在原码表⽰法中,对0有两种表⽰形式:[+0]原=00000000[-0] 原=100000002)补码表⽰机器数的补码可由原码得到。

如果机器数是正数,则该机器数的补码与原码⼀样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1⽽得到的。

设有⼀数X,则X的补码表⽰记作[X]补。

例如,[X1]=+1010110[X2]= ⼀1001010[X1]原=01010110[X1]补=01010110即 [X1]原=[X1]补=01010110[X2] 原= 11001010[X2] 补=10110101+1=10110110(3)反码表⽰法机器数的反码可由原码得到。

如果机器数是正数,则该机器数的反码与原码⼀样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反⽽得到的。

设有⼀数X,则X的反码表⽰记作[X]反。

例如:X1= +1010110X2= ⼀1001010[X1]原=01010110[X1]反=[X1]原=01010110[X2]原=11001010[X2]反=10110101反码通常作为求补过程的中间形式,即在⼀个负数的反码的未位上加1,就得到了该负数的补码。

负数的⼆进制表⽰:|负数|-1,然后取反。

例1. 已知[X]原=10011010,求[X]补。

分析如下:由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1⽽得到。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。

机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数+3 ,计算机字长为8位,转换成二进制就是00000011。

如果是-3 ,就是10000011 。

那么,这里的00000011 和10000011 就是机器数。

2、真值因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3 而不是形式值131(10000011转换成十进制等于131)。

所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值= +000 0001 = +1,1000 0001的真值= –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法.在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.1. 原码原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:[+1]原 = 0000 0001[-1]原 = 1000 0001第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]原码是人脑最容易理解和计算的表示方式.2. 反码反码的表示方法是:正数的反码是其本身负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.3. 补码补码的表示方法是:正数的补码就是其本身负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.三. 为何要使用原码, 反码和补码在开始深入学习前, 我的学习建议是先"死记硬背"上面的原码, 反码和补码的表示方式以及计算方法.现在我们知道了计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:[+1] = [00000001]原 = [00000001]反 = [00000001]补所以不需要过多解释. 但是对于负数:[-1] = [10000001]原 = [11111110]反 = [11111111]补可见原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.于是人们开始探索将符号位参与运算, 并且只保留加法的方法. 首先来看原码:计算十进制的表达式: 1-1=01 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.为了解决原码做减法的问题, 出现了反码:计算十进制的表达式: 1-1=01 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.于是补码的出现, 解决了0的符号以及两个编码的问题:1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.四原码, 反码, 补码再深入计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢? 将钟表想象成是一个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:1. 往回拨2个小时: 6 - 2 = 42. 往前拨10个小时: (6 + 10) mod 12 = 43. 往前拨10+12=22个小时: (6+22) mod 12 =42,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12后的余数是4.所以钟表往回拨(减法)的结果可以用往前拨(加法)替代!现在的焦点就落在了如何用一个正数, 来替代一个负数. 上面的例子我们能感觉出来一些端倪, 发现一些规律. 但是数学是严谨的. 不能靠感觉.首先介绍一个数学中相关的概念: 同余同余的概念两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余记作a ≡b (mod m)读作a 与b 关于模m 同余。

举例说明:4 mod 12 = 416 mod 12 = 428 mod 12 = 4所以4, 16, 28关于模12 同余.负数取模正数进行mod运算是很简单的. 但是负数呢?下面是关于mod运算的数学定义:上面是截图, "取下界"符号找不到如何输入(word中粘贴过来后乱码). 下面是使用"L"和"J"替换上图的"取下界"符号:x mod y = x - y L x / y J上面公式的意思是:x mod y等于x 减去y 乘上x与y的商的下界.以-3 mod 2 举例:-3 mod 2= -3 - 2xL -3/2 J= -3 - 2xL-1.5J= -3 - 2x(-2)= -3 + 4 = 1所以:(-2) mod 12 = 12-2=10(-4) mod 12 = 12-4 = 8(-5) mod 12 = 12 - 5 = 7开始证明再回到时钟的问题上:回拨2小时= 前拨10小时回拨4小时= 前拨8小时回拨5小时= 前拨7小时注意, 这里发现的规律!结合上面学到的同余的概念.实际上:(-2) mod 12 = 1010 mod 12 = 10-2与10是同余的.(-4) mod 12 = 88 mod 12 = 8-4与8是同余的.距离成功越来越近了. 要实现用正数替代负数, 只需要运用同余数的两个定理:反身性:a ≡a (mod m)这个定理是很显而易见的.线性运算定理:如果a ≡b (mod m),c ≡d (mod m) 那么:(1)a ± c ≡b ± d (mod m)(2)a * c ≡b * d (mod m)如果想看这个定理的证明, 请看:/view/79282.htm所以:7 ≡7 (mod 12)(-2) ≡10 (mod 12)7 -2 ≡7 + 10 (mod 12)现在我们为一个负数, 找到了它的正数同余数. 但是并不是7-2 = 7+10, 而是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 = 126126 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 = 127127 mod 128 = 1272-1 ≡2+127 (mod 128)此时, 表盘相当于每128个刻度转一轮. 所以用补码表示的运算结果最小值和最大值应该是[-128, 128].但是由于0的特殊情况, 没有办法表示128, 所以补码的取值范围是[-128, 127]本人一直不善于数学, 所以如果文中有不对的地方请大家多多包含, 多多指点!。

相关文档
最新文档