一般意义上的二进制:
二进制表示:0000
0001 0010
0011 0100
0101 0110
0111 1000
1001 1010
1011 1100
1101 1110
1111
对应数字: 0
1 2
3 4 5
6 7
8 9 10
11 12
13 14 15
注:这是通常生活中所理解的二进制,但只能表示自然数,实际上这也就是无符号数的原码。
原码:
计算机中对数字的二进制表示。最高位为符号位,0表示正数,1表示负数。
二进制表示:0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
对应数字: 0
1 2
3 4 5
6 7
0 -1 -2
-3
-4 -5 -6
-7
注:原码可以表示任何整数,但存在两个问题。
1.正负数相加不为0,如1和-1的原码相加 0001+1001 = 1010,对应原码为-2。
2.存在两个0,即0000和1000。
为解决正负数相加不为0的问题,我们采用反码的表示方法。
反码:
正数表示与原码相同,负数是除去符号位各位取反。
二进制表示:0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
对应数字: 0
1 2
3 4 5
6 7
-7 -6 -5
-4
-3 -2 -1
-0
注:反码解决了原码中正负号相加的问题。如1和-1的反码相加,0001 + 1110 = 1111 = -0 =0。
但是存在两个0的问题依旧没有解决,所以我们需要用到补码。
补码:
正数表示与原码相同,负数是除去符号位各位取反,并且加1。
二进制表示:0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
对应数字: 0
1 2
3 4 5
6 7
-8 -7 -6
-5
-4 -3 -2
-1
(以上内容参考《C语言点滴》赵岩)