计算机中只有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++)
;//不是无限循环的函数
原码和补码