原码、反码、补码详解

合集下载

原码、反码、补码

原码、反码、补码

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

如单字节的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⽽得到。

原码、反码、补码、移码、阶码、BCD码、余3码

原码、反码、补码、移码、阶码、BCD码、余3码

原码、反码、补码、移码、阶码、BCD码、余3码原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。

源码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数。

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

补码:补码(two’s complement) 1、在计算机中,数值一律用补码表示(存储)。

主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法处理。

另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

2、补码与原码的转换过程几乎是相同的。

==补码的概述==求给定数值的补码表示分以下两种情况:(1)正数的补码:与原码相同。

【例1】+9的补码是00001001。

(这个+9的补码说的是用8位的2进制来表示补码的,补码表示表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。

)(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后加1。

同一数字在不同的补码表示形式里头是不同的。

【例2】求-7的补码。

因为给定数是负数,则符号位为“1”。

后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001),所以-7的补码为1111001。

已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

另一种方法求负数的补码,如下:例如:求-15的补码第一步:+15:00001111第二步:逐位取反,然后在末位加1。

11110001【例3】已知一个补码11111001则原码是10000111(-7)。

(补码的补码)“模”的概念“模”是指一个计量系统的计数范围。

如时钟等。

计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。

原码、反码、补码、移码的转换方法,范围、特点

原码、反码、补码、移码的转换方法,范围、特点

原码、反码、补码、移码的转换方法,范围、特点原码、反码、补码和移码是计算机中用于表示有符号整数的编码方法。

它们具有不同的转换方法、表示范围和特点。

1. 原码(Sign-Magnitude):- 范围:原码表示的有符号整数范围与无符号整数相同,但有一位符号位,可能是正或负。

- 转换方法:将整数的绝对值转换成二进制形式,并在最高位添加符号位,正数为0,负数为1。

- 特点:原码的最高位表示数值的符号,其余位表示数值的大小。

2. 反码(Ones' Complement):- 范围:反码表示的有符号整数范围与无符号整数相同,但有一位符号位,可能是正或负。

- 转换方法:正数的反码与原码相同,负数的反码是对其绝对值的原码按位取反(1变0,0变1)。

- 特点:反码有两个零(+0和-0),且数值的正负通过最高位的符号位来表示。

3. 补码(Two's Complement):- 范围:补码表示的有符号整数范围比无符号整数少一位,即一个比绝对值更小的负数。

- 转换方法:正数的补码与原码相同,负数的补码是对其绝对值的原码按位取反,并在最后一位加1。

- 特点:补码表示了一个额外的负数,可以减少负数的表示范围;最高位的符号位与绝对值的大小无关,方便进行运算。

4. 移码(Excess-K):- 范围:移码表示的有符号整数范围与无符号整数相同,但有一位符号位,可能是正或负。

- 转换方法:将整数的绝对值加上一个偏移量K后转换成二进制形式,并在最高位添加符号位,正数为0,负数为1。

- 特点:移码的最高位表示数值的符号,其余的位表示数值的大小;移码中的零不是+0,而是-K。

这些编码方法在计算机中用于表示有符号整数,每种编码方法都有其特定的优势和应用场景。

例如,补码广泛用于计算机中进行二进制的数值运算,因为可以用同一套逻辑电路处理正数和负数。

原码,反码,补码,移码的概念以及各自的用途和优点

原码,反码,补码,移码的概念以及各自的用途和优点

原码,反码,补码,移码的概念以及各⾃的⽤途和优点1.原码将最⾼位⽤作符号位(0表⽰正数,1表⽰负数),其余各位代表数值本⾝的绝对值的表⽰形式。

例如,假设⽤8位表⽰⼀个数,则+10的原码是00001010,-10的原码是10001010。

直接使⽤原码在计算时会有⿇烦,例如,(1)10+(-1)10=0。

如果直接使⽤原码,则(00000001)2+(10000001)2=(10000010)2这样计算的结果是-2也就是说,使⽤原码直接参与计算可能会出现错误的结果。

所以,原码的符号位不能直接参与计算,必须和其他位分开,这样会增加硬件的开销和复杂性。

2.反码正数的反码与原码相同。

负数的反码符号位为1,其余各位为该数绝对值的原码按位取反。

例如,-11的反码是11110100。

同样,对上⾯的加法,使⽤反码的结果是:(00000001)2+(11111110)2=(11111111)2这样的结果是负0。

⽽在⼈们普遍的观念中,0是不分正负的。

反码的符号位可以直接引参与计算,⽽且减法也可以转换为加法计算。

3.补码正数的补码与原码相同。

负数的补码是该数的反码加1,这个加1就是“补”。

例如-11的补码为11110100+1=11110101再次做以上的加法,是这样的:+(11111111)2=(00000000)2(00000001)2这说明,直接使⽤补码进⾏计算的结果是正确的。

对⼀个补码表⽰的数,要计算其原码,只要对它再次求补即可。

由于补码能使符号位与有效值部分⼀起参与运算,从⽽简化了运算规则,同时它也使减法运算转换为加法运算,进⼀步简化计算机中运算器的电路,这使得在⼤部分计算机系统中,数据都使⽤补码表⽰。

4.移码移码⼜称为增码,移码的符号表⽰和补码相反,1表⽰正数,0表⽰负数。

也就是就是说,移码是在补码的基础上把⾸位取反得到的,这样使得移码⾮常适合于阶码的运算,所以移码常⽤于表⽰阶码。

对于正数:原码和反码,补码都是⼀样的,都是正数本⾝。

原码,反码,补码详解

原码,反码,补码详解

原码,反码,补码详解本篇⽂章讲解了计算机的原码, 反码和补码. 并且进⾏了深⼊探求了为何要使⽤反码和补码, 以及更进⼀步的论证了为何可以⽤反码, 补码的加法计算原码的减法. 论证部分如有不对的地⽅请各位⽜⼈帮忙指正! 希望本⽂对⼤家学习计算机基础有所帮助!⼀. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.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 同余。

原码、反码、补码之间的关系

原码、反码、补码之间的关系

原码、反码、补码之间的关系
1、原码是最简单的编码方式,是都以符号位来标识有符号数的编码方式。

原码的最
高位称为符号位,符号位为0表示正数,符号位为1表示负数,其余各位表示数值的大小。

所有的正数的原码、反码和补码都是相等的,正数的符号位都是0,因此无需考虑其反码
和补码的关系。

2、反码是指数字编码的另一种编码方式,用于表达负数。

负数的反码是将其原码中
的符号位不变,将其余各位取反。

因此,反码的最高位,也就是符号位,和原码是相同的,而其他位的值则取反得到,以表示负数的编码。

3、补码是反码的另一种编码形式,它也是用来表达负数的。

补码就是与反码有着一
定区别,其中最大的区别就是补码需要对反码再做一次加1操作。

也就是说,反码的最低
位出现1时,要把它最低位补进去,完成了补码。

什么是原码、反码、补码

什么是原码、反码、补码

[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
三. 为何要使用原码, 反码和补码
在开始深入学习前, 我的学习建议是先"死记硬背"上面的原码, 反码和补码的表示方式以及计算方法.
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.
一. 机器数和真值
在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
x mod y = x - y L x / y J

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

原码、反码与补码知识讲解
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量 器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。 对于计算机,模也就是相应位数寄存器所能表示的最大数再加。如位寄存器所能 存储的数是,这样位寄存器的模就等于。rqyn1。rqyn1。
码、阶码与移码
小数“”的补码只有一种表示形式,即…。 . 整数补码表示法 设二进制整数±…,则其补码定义为: 例如, 时,根据以上公式可得[]补 ; 时,根据以上公式可得[] 补 。同样,整数“”的补码也只有一种表示形式,即…。采用补码进行加、减 运算时,可以将加、减运算均通过加法实现,运算规则如下: LDAYt。LDAYt。 [ ]补 []补 []补
分别是[]补和[] 补。
“非”运算实现逻辑否定,即进行求反运算,非运算规则: , 。注意“非”运
补码的减法运算规则是:
算只是针对一个数所进行的“运算”,这与前面的“与”和“或”运算不一样。它的实
[-]补[]补+[-]补
3/4
个人收集整理-ZQ 质意义就是取反。如“”进行“非”运算后就得到“”,对比相应位即可验证以上运算 规则了。sQsAE。sQsAE。
正负数表示、定点数与浮点数 在计算机内,通常把个二进制数的最高位定义为符号位,用“”表示正数,“” 表示负数;其余位表示数值。 规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮 动的数称为“浮点数”。 原码 原码表示法是定点数的一种简单的表示法。用原码表示带符号二进制数时, 符号位用表示正,表示负;数值位保持不变。原码表示法又称为符号数值表示 法。b5E2R。b5E2R。 . 小数原码表示法 设有一数为,则原码表示可记作[]原(下标表示)。例如, + ; 原码表示数的范围与二进制位数有关。设二进制小数±…,则小数原码的定 义如下: 例如:时, 根据以上公式可得[]原;-时,根据以上公式可得[]原 ()

原码,补码,反码和有符合,无符号整数知识总结

原码,补码,反码和有符合,无符号整数知识总结

原码,补码,反码和有符合,⽆符号整数知识总结原码 (true form)是⼀种中对数字的定点表⽰⽅法。

原码表⽰法在数值前⾯增加了⼀位符号位(即最⾼位为符号位):该位为0,负数该位为1(0有两种表⽰:+0和-0),其余位表⽰数值的⼤⼩。

例如,我们⽤8位表⽰⼀个数,+11的原码为00001011,-11的原码就是10001011不能直接参加运算,可能会出错。

例如数学上,1+(-1)=0,⽽在中原码00000001+10000001=10000010,换算成为-2。

显然出错了。

所以计算机并不是以原码的形式存储整数的。

反码:正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1。

例如对于⼆进制原码10010求反码:11101。

例如,我们⽤8位表⽰⼀个数,+11的反码为00001011(和原码⼀样),-11的反码就是1111 0100(把-11的原码10001011 符号位保持1,数值为取反)虽然反码能存储数值,但是我们很容易可以看到,这样存储⽅式很不容易被⼈类思维理解。

所以多数计算机不采⽤反码表⽰数值补码:正整数的补码是其⼆进制表⽰,与相同。

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。

例如,我们⽤8位表⽰⼀个数,+11的补码为00001011,-11的补码就是1111 0101(把-11的原码10001011 符号位保持1,数值为取反,得到数之后再+1)。

从上⾯的例⼦可以看出,对于负数来说,补码=原码的反码+1,对于正数来说补码=原码=反码。

我们⽤4个Bit 来做个⽰例:⼗进制数原码反码补码+70111表⽰⽅式不变表⽰⽅式不变+60110表⽰⽅式不变表⽰⽅式不变+50101表⽰⽅式不变表⽰⽅式不变+40100表⽰⽅式不变表⽰⽅式不变+30011表⽰⽅式不变表⽰⽅式不变+20010表⽰⽅式不变表⽰⽅式不变+10001表⽰⽅式不变表⽰⽅式不变+00000表⽰⽅式不变表⽰⽅式不变-010001111[1]0000-1100111101111-2101011011110-3101111001101-4110010111100-5110110101011-6111010011010-7111110001001-8超出4个bit所能表达范围超出4个表达范围1000计算机中的符号数有三种表⽰⽅法,即、和补码。

计算机中数值的三种表示方法详解:原码,反码, 补码

计算机中数值的三种表示方法详解:原码,反码, 补码

计算机中数值的三种表示方法详解原码,反码,补码最近在学习软件评测师的知识,其中涉及到计算机的原码, 反码和补码等知识. 通过网上查阅资料,进行了深入学习,分享给大家。

本文主要从以下几点进行介绍:如何计算原码,反码,补码?为何要使用反码和补码?希望本文对大家学习计算机基础有所帮助一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.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二. 原码, 反码, 补码的基础概念和计算方法.计算机中的符号数有三种表示方法,即原码、反码和补码。

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用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]补对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.简单总结以下,反码和补码的表示方式以及计算方法.对于正数,三种编码方式的结果都相同:正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同。

计算机原理(原码、反码、补码)

计算机原理(原码、反码、补码)

计算机原理- 整数的补码,原码, 反码解释一:对于整数来讲其二进制表示没有符号位.一个字节的表示范围为00000000-11111111,由此可见一个字节的整数表示范围为[0,255=2^8 - 1]。

对于整数来讲,其二进制表示中存在一个符号位.先来看一下下面几个定义:1:在计算机中,负数以其正值的补码形式表达。

正数即在符号位补0.2:原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

3:反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

4:补码: 反码+1由以上可以得到.计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。

范围: 正数 [00000000 - 01111111] 即[0, 2^7 - 1]。

负数 [10000000 - 11111111] 。

范围说明. 11111111 - 1 = 11111110,取反=00000001 即是-1. 10000000 -1 = 01111111,取反=10000000, 即是-128. 因此有一个有符号二进制表示范围是从[-128-127].解释二:大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即2^8(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~2^8 -1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。

别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。

原码反码补码的计算方法

原码反码补码的计算方法

原码、反码和补码的计算方法一、原码表示法原码表示法是一种最简单的数值表示方法,它将数值的绝对值转换为二进制形式,并在最高位为符号位,正数为0,负数为1。

例如,+7和-7的原码表示如下:+7: 0111-7: 1111原码表示法可以直接进行加减运算,但由于符号位和数值位混在一起,计算时容易出错。

二、反码表示法反码表示法将原码符号位不变,其余各位取反,正数反码与原码相同,负数的反码是对其原码取反(除符号位外)。

例如,+7和-7的反码表示如下:+7: 0111-7: 1000反码表示法在进行加减运算时,可以避免符号位的干扰,提高了计算的准确性。

但需要注意的是,在进行反码加法运算时,可能会出现“溢出”的情况,即结果超出反码表示的范围。

三、补码表示法补码表示法是一种为了方便计算机进行加减运算而采用的一种编码方式。

它也是在原码的基础上进行变换,正数的补码与其原码相同,负数的补码是在其反码的基础上加1。

例如,+7和-7的补码表示如下:+7: 0111-7: 1001补码表示法在进行加减运算时,不仅可以避免符号位的干扰,而且可以直接进行加减运算,无需考虑溢出问题。

因此,补码表示法被广泛应用于计算机系统中。

四、原码、反码和补码的转换在进行数值计算时,需要根据实际情况选择合适的编码方式。

对于不同的编码方式,需要进行相应的转换。

下面介绍原码、反码和补码之间的转换方法:1. 原码转反码:对于正数,其反码与原码相同;对于负数,将其原码除符号位外全部取反。

2. 原码转补码:对于正数,其补码与原码相同;对于负数,将其反码加1。

3. 反码转补码:对于正数和负数,直接将反码加1。

4. 补码转原码:对于正数和负数,直接将补码减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]本人一直不善于数学, 所以如果文中有不对的地方请大家多多包含, 多多指点!。

相关文档
最新文档