补充概念
前置概念
- 原码 补码 反码概念及相互转换
- 这是内存中的保存形式
- 我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的
原码 补码 反码概念及相互转换
计算机存储数据是以2进制形式存储, 即由0和1组成的数据, 因为在冯·诺依曼计算机体系结构中只存在加法运算器,
且 加法运算器就能完成负数运算,比如减去一个数可以看成加上这个数的相反数,原码、反码、补码的产生过程就是
为了解决计算机做减法和引入符号位的问题
1.整型以补码的形式转化成二进制存储
2.字符则先按照ASCLL码转化成所对应的十进制整数,再按照整型处理
3.而实数按照二进制浮点数算术标准(IEEE 754标准)转化成二进制存储
原码,补码,反码概念
原码
是有符号数的一种二进制表示方式, 由符号+其他二进制构成一个整数,最左位符号1或0 代表负数和正数
正数 | 原码 | 负数 | 原码 |
---|---|---|---|
0 | 0000 | -0 | 1000 |
1 | 0001 | -1 | 1001 |
2 | 0010 | -2 | 1010 |
3 | 0011 | -3 | 1011 |
4 | 0100 | -4 | 1100 |
1 + 1 => 0001 + 0001 => 0010 = 2
1 + (-1) => 0001 + 1001 => 1010 = -2
0 + -0 => 0000 + 1000 => 1000 = -0
可以看出负数参与运算后产生了奇奇怪怪的结果,这都是因为符号位导致的
特点
- 原码表示直观,与真值转换方便
- 0有两种不同表示形式, 给使用带来了不便
- 原码进行加减运算想保证结果正确运算过程复杂
反码
正数不变, 将原码除了符号位全部取反的操作. 0变1 , 1变0.
正数 | 反码 | 负数 | 反码 |
---|---|---|---|
0 | 0000 | -0 | 1111 |
1 | 0001 | -1 | 1110 |
2 | 0010 | -2 | 1101 |
3 | 0011 | -3 | 1100 |
4 | 0100 | -4 | 1011 |
1 + 1 => 0001 + 0001 => 0010 = 2
1 + (-1) => 0001 + 1110 => 1111 = -0
0 + (-0) => 0000 + 1111 => 1111 = -0
结果对,但是符号位不对 想要得到的结果是 1 +(-1) 应该为 0000
反码的特点
- 在反码中, 符号也是表示为数值的正负.
- 在反码中, 数值0也有两种表示
- 反码的表示范围与原码范围相同
补码
类似原码, 理解为原码的绝对值. 模和同余数的概念. 正数的补码等于它的原码, 负数的补码等于反码 末位+1 也可以直接取反末位+1,这里 原码和反码可以看出不利于直接做加法运算,且0会有正负的表示方式,所以就引申出补码
正数 | 补码 | 负数 | 补码 |
---|---|---|---|
0 | 0000 | -0 | |
1 | 0001 | -1 | 1111 |
2 | 0010 | -2 | 1110 |
3 | 0011 | -3 | 1101 |
4 | 0100 | -4 | 1100 |
1 + 1 => 0001 + 0001 => 0010 = 2
1 + (-1) => 0001 + 1111 => 0000 = 0
0 + (-0) => 0000 + 0000 => 0000 = 0 // -0不存在补码 只有0000一种表示方式
1 + (-3) => 0001 + 1101 => 1110 = -2
结果上没问题
如果A与B的补码相加,产生溢出(进阶), 溢出部分要被去掉
相当于:
5 - 3 = 5 + ( 7 - 10 )= 5 + 7 -10 = 12 - 10 因为进阶了,所以要去10
也就是说放到四位2进制就是如果得出结果10010就要减去10000?得到0010
补码的特点
- 在补码中,用符号位表示数值的正负,与原码相同
- 补码中数值0只有一种表示
- 补码的符号位可以参与运算
- 计算机中采用补码进行加减运算
- 负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到-1,纯整数的补码可以表示到-2^n
位运算
>> 右移
5 >> 2
右移 2 位 左补2位00
<< 左移
5 << 2
左移 2 位 右补2为00
>>> 符号右移
-5 >>> 2
不带符号右移 2 位, 符号位变0 正数左补00 负数左补10
& 位与
5 & 2
2进制都为1才为1
| 位或
5 | 2
2进制有一个为1就为1
^ 位异或
5 ^ 2
2进制不相同即 一个为1 一个为0 则为 1
~ 位非
~ 5
2进制取反 0变1 1变0
评论区