* 对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0
* 计算机存储的就是补码,使用补码进行运算免去了符号位带来的麻烦
* 在计算机内,定点数有3种表示法:**原码、反码和补码**
* 原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
* 正数的原码与补码相同,负数补码为其绝对值各位取反加1
* 负数的补码是其绝对值取反
**+21,其二进制表示形式是00010101,则其补码同样为00010101**
**-21的表示方式**
1. 按照概念其**绝对值为00010101**,各位**取反为11101010**,**再加1**为11101011,即-21的二进制表示形式为11101011
**1. byte为一字节8位,最高位是符号位,即最大值是01111111,因正数的补码是其本身,即此正数为01111111**
2. 10000000是最小负数的补码表示形式,我们把补码计算步骤倒过来就即可。10000000减1得01111111然后取反10000000
因为负数的补码是其绝对值取反,即10000000为最小负数的绝对值,而10000000的十进制表示是128,所以最小负数是-128
## 八进制
以0开头
## 十六进制
以0x开头,1-F,一个数字代表四位
f代表15,二进制表示00001111
## 练习题
![](https://img.kancloud.cn/3e/c7/3ec784b0c768cc008d72fbb2bf07fbea_672x234.png)
```
0Xf000000000000000补码为1111000000000000000000000000000000000000000000000000000000000000
0x7FFFFFFFFFFFFFFF补码为0111111111111111111111111111111111111111111111111111111111111111
a-b=a+(-b)=
1111000000000000000000000000000000000000000000000000000000000000+
1000000000000000000000000000000000000000000000000000000000000001=
10111000000000000000000000000000000000000000000000000000000000001(高位溢出舍去)
则结果为
0111000000000000000000000000000000000000000000000000000000000001=
2^62+2^61+2^60+1
```
答案为C
## 1-2 的二进制运算
1的原反补码都相同,都是
0000 0001
-2 的原码是
1000 0010
补码是符号位不变,取反
1111 1101
加1
1111 1110
```
0000 0001
+
1111 1110
=
1111 1111
```
结果是负数,减一取反,得到原码
1000 0001 即为-1