整数的正负表示
有符号数: 最高位作符号这种表示的整数叫做有符号数(有正负之分)。
最高位作符号位1表示负数0表示正数
如果用1个字节(8位)表示整数,那么:
1111000:负数
0111000:正数
无符号数:无负数,表示0和正整数,最高位无需表示正负。
一个字节的整数
有符号[-128:127]
无符号[0,255]
整数的编码:原码
原码就是在数值前面增加一位符号数(即最高位为符号数)该位为0表示正数,该位为1表示负数,其余位表示数值的大小。
小例子:以一个字节作为整数的存储
1: 00000001
-1: 10000001
那么1-1=1+(-1) = 00000001 + 10000001 = 10000010 = -2是错误的,符号位无法参加运算。
整数的编码:反码
正整数的反码就是其自身,而负整数的反码可以通过对其绝对值逐位求反来求得。以一个字节作为整数得存储长度为例子。
小例子:以一个字节作为整数的存储
1: 00000001
-1: 10000001 => 11111110
那么1 – 1 = 1 + (-1) = 00000001 + 11111110 = -0
反码的问题出现在(0)和(-0)上,因为在人们的计算概念中零是没有正负之分的。
整数的编码: 补码
正数的补码为它本身,负数的补码就是它的绝对值求反加1。
如果一个二进制数是负数1001100怎么才能知道它原来的数呢?还是取反加1
0的补码是0
100的补码: 1100100
1的补码00000001
-1的补码00000001->11111110+1 = 11111111
127的补码01111111
-128的补码10000000 -> 01111111+1=10000000
47的补码00101111
-47的补码11010000 + 1 = 11010001
补码的好处 0是唯一的好处 符号位可以参与计算
扩充 一个字节的补码扩充到2个字节,4个字节;
正数 零扩充
负数 符号位扩充