计算机中只有0和1,在这种条件约束下,只能表达正整数和0;

字长:计算机cpu的性能指标,指cpu一次可以加工,处理的二进制位数。

定长:计算机在表示信息的时候,采用固定的二进制位数,这个二进制位数叫做定长。

在n位定长的约束下,计算机表示的数值范围为[0,2^n)

在n位定长下,存在以下的等式

            2^n = 0

原码:

为了能够表示负数,引入原码

原码在N位定长的基础上,引入最高位表示正负,其中1表示负,0表示正数。

n位原码的取值范围为(-2^(n-1),2^(n-1))

当n为8时,为[-127,+127]

计算机中没有原码

补码:

在计算机中存在两大运算:逻辑运算和算术运算

逻辑运算:或,与,非,异或

A     B     A&&B   A||B    A^B  

0     1      0       1     1

1     1       1       1     0

1     0      0        1     1

1     1       1       1      0

算术运算:

A  B   A+B

0  1   01

1   1  10

1   0  01

0   1   01

总结:进位等于A&&B

        本位等于A^B

由于减法电路中存在借位,无法用简单的电路实现,所以引入补码

补码的定义:

      如表示正数,则原码等于补码  

      如表示负数,则在原码的基础上,除符号位外,各位取反然后末位加1

在定长为8的时,-8的原码:

    1000 1000 

所以根据定义其补码为:

    1111 1000

(x + y)的补码 = x的补码 + y的补码

n位补码表示的范围:[-2^(n-1),2^(n-1))

n位补码比n位原码多表示一位数的原因:

在原码表示0的时候 0000 0000表示0 1000 0000表示0,

上述两个原码对应同一个补码,所以原码比补码少一个数

补码存在一个问题 

        以8位定长来说,它的补码范围[-127,127)

        127+1 == -127

        如上式,补码的大小有范围且相互连接

        int i;

        for(i = 1; i > 0; i++)

            ;//不是无限循环的函数