原码、反码和补码

来源:互联网 发布:mac读写ntfs破解版 编辑:程序博客网 时间:2024/04/28 07:46

一、原码 

求原码:X≥0,则符号位为0,其余照抄;
X≤0,则符号位为1,其余照抄。
【例1】X=+1001001    [X]原 = 01001001
【例2】X=-1001001    [X]原 = 11001001 

二、反码 
求反码:若X≥0,符号位为0,其余照抄;
若X≤0,符号位为1,其余按位取反。
【例3】X=+1001001    [X]反 = 01001001
【例4】X=-1001001    [X]反 = 10110110 

三、补码 
求补码:若X≥0,符号位为0,其余照抄;
若X≤0,符号位为1,其余取反后,最低位加1。
【例5】X=+1001001    [X]补 = 01001001
【例6】X=-1001001    [X]补 = 10110111 

四、补码加减法
   计算机中实际上只有加法,减法运算转换成加法运算进行,乘法运算转换成加法运算进行,除法运算转换成减法运算进行。用补码可以很方便的进行这种运算。 

1、补码加法
    [X+Y]补 = [X]补 + [Y]补
【例7】X=+0110011,Y=-0101001,求[X+Y]补
     [X]补=00110011   [Y]补=11010111
     [X+Y]补 = [X]补 + [Y]补 = 00110011+11010111=00001010
     注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是
         100001010,而是00001010。 

2、补码减法
    [X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补
    其中[-Y]补称为负补,求负补的方法是:对补码的每一位(包括符号位)求反,最后末位加“1”。
【例8】X=+0111001,Y=+1001101,求[X-Y]补
     [X]补=00111001   [Y]补=01001101   [-Y]补 = 10110011
     [X-Y]补 = [X]补 + [-Y]补 = 00111001+10110011=11101100 

五、数的表示范围
     通过上面的学习,我们就可以知道计算机如果用一个字节表示一个整数的时候,如果是无符号数,可以表示0~255共256个数(00000000~11111111),如果是有符号数则能表示-128~127共256个数(10000000~01111111)。如果两个字节表示一个整数,则共有65536个数可以表示,大部分程序设计语言中整数的范围都是-32768~32767的原因,可以看出这种整数类型是16位的有符号数,而且是补码表示的。


正数的反码和补码都是和原码相同。

为什么要设立补码呢?

第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补

第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)

有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个 

原创粉丝点击