有符号数无符号数补码反码
有符号数和无符号数
在计算机中,使用0表示正数,使用1表示负数,比如237
的二进制为011101101
,而-237
的二进制为111101101
,约定符号位为数字位的最前面。比如用两个字节来存正整数237
:
1 | 237 = 0000 0000 1110 1101 |
如果用两个字节在存负整数-237
则表示为:
1 | -237 = 1000 0000 1110 1101 |
这种对于正数和负数的表示方法称为**原码表示法**
二进制原码表示法
使用0表示正数、1表示负数,规定符号位位于数值第一位,原码表示法虽然有利于理解,但是对于一些特殊情况还是有一定的缺陷的,比如0
使用原码表示法有两种表示方式:
1 | +0 = 00 |
但是不管+0
还是-0
都为0
,并且使用原码进行运算非常复杂,特别是两个操作数符号不相同的时候,需要判断两个操作数的绝对值大小,并且使用绝对值大的数减去绝对值小的数,并且对于符号值,需要以绝对值大的符号为准
二进制补码表示法
为了解决原码运算复杂等问题,希望找到使用正数代替负数的方法,使用加法代替减法操作,从而消除减法,提出了补码表示法
,一个数的补码可以分为两种情况,假设一个数为x
x >= 0
则x
的补码就为x
x < 0
则x
的补码为2^n+1 + x
其中n
表示x
的位数
例如x = 13
,则x
的原码以及补码为:如果1
2
3
4
5
6
7原码:x = 13 = 0 1101
|
符号位
补码:x = 13 = 0 1101
|
符号位x = -13
,则x
的原码以及补码为:这里再举一个例子用来熟悉怎么计算原码和补码:1
2
3
4
5原码:x = -13 = 1 1101
|
符号位
补码:x = -13 = 2^4+1 + (-13) = 32 - 13 = 100000 - 1101 = 100111
2
3
4
5
6
7x=-7
原码:x = -7 = 1 0111
|
符号位
补码:x = -7 = 2^4+1 + (-7) = 100000 - 0111 = 1 1001
|
符号位正数的补码 = 原码, 负数的补码 = {原码符号位不变} + {数值位按位取反后+1}
二进制反码表示法
补码虽然消除了负数,但是计算补码的过程中。还是使用了减法,为了找出原码和补码之间的规律消除转换过程中的减法,提出了反码表示法
,一个数的反码同样可以分为两种情况,假设一个数为x
:
x >= 0
时,反码就为x
x < 0
时,反码为(2^n+1 - 1) + x
其中n
表示x
的位数
例如x = 13
,则x
的原码、补码以及反码分别为:
1 | 原码:x = 13 = 0 1101 |
如果x = -13
,则x
的原码、补码以及反码分别为:
1 | 原码:x = -13 = 1 1101 |
同样再举一个例子用来熟悉怎么计算原码、补码和反码:
1 | x = -7 |
总结
手算完上面的几个例子后,相信对于原码、补码、反码的计算应该很熟悉了,我们再把几个例子汇总一下,总结一下规律:
十进制 | 原码 | 补码 | 反码 |
---|---|---|---|
13 | 0 1101 | 0 1101 | 0 1101 |
-13 | 1 1101 | 1 0011 | 1 0010 |
7 | 0 0111 | 0 0111 | 0 0111 |
-7 | 1 0111 | 1 1001 | 1 1000 |
仔细观察,可以总结出以下规律:
- 负数的补码等于原码(除了符号位)按位取反再加1
- 负数的反码等于原码(除了符号位外)按位取反
- 负数的补码等于反码加1
通过总结出的规律,相信可以很快速的计算出一个数的反码和补码了