原码、反码、补码及位移运算
对于有符号数而言的性质
(1)正数的原码、反码、补码都一样
(2)负数的反码 = 符号位不变,其他位取反
(3)负数的补码 = 它的反码+1
(4)0的补码、反码都是0
(5)计算机运算的时候,都是按照补码来运算的
有符号数运算的案例
1.正数相加
例如1+1:
1的原码: 00000000 00000000 00000000 00000001
1的反码: 00000000 00000000 00000000 00000001
1的补码: 00000000 00000000 00000000 00000001
两数补码相加: 00000000 00000000 00000000 00000010
(此时结果为补码,正数补码原码相同,故不需要转化)
结果转化为十进制,即2
2.正数相减
例如1-2:
1的原码: 00000000 00000000 00000000 00000001
1的反码: 00000000 00000000 00000000 00000001
1的补码: 00000000 00000000 00000000 00000001
-2的原码: 10000000 00000000 00000000 00000010
-2的反码: 11111111 11111111 11111111 11111101
-2的补码: 11111111 11111111 11111111 11111110
两数补码相加:11111111 11111111 11111111 11111111
结果转化为反码:11111111 11111111 11111111 11111110
再转化为原码:10000000 00000000 00000000 00000001
转化为十进制,即-1
<< 左移运算符
左移一位,左侧第一位舍弃,右侧用0填补
一般来说,左移后数值等于原来的两倍,但也有例外情况(比如丢失符号位)
>> 右移运算符
100带符号右移
100的原码、反码、补码均为: 00000000 00000000 00000000 01100100
右移四位: 00000000 00000000 00000000 00000110
-100带符号右移
-100的原码: 10000000 00000000 00000000 01100100
-100的反码: 11111111 11111111 11111111 10011011
-100的补码: 11111111 11111111 11111111 10011100
右移四位: 11111111 11111111 11111111 11111001
(左侧高位补1) —>此时还是补码,需要转换
转化成反码: 11111111 11111111 11111111 11111000
(减1)
转化为原码: 10000000 00000000 00000000 00000111
>>> 无符号右移运算符
100无符号右移(同>>)
100的原码、反码、补码均为: 00000000 00000000 00000000 01100100
右移四位: 00000000 00000000 00000000 00000110
-100无符号右移
-100的原码: 10000000 00000000 00000000 01100100
-100的反码: 11111111 11111111 11111111 10011011
-100的补码: 11111111 11111111 11111111 10011100
无符号右移四位:在高位补0
的反码: 11111111 11111111 11111111 10011011
-100的补码: 11111111 11111111 11111111 10011100
无符号右移四位:在高位补0
00001111 11111111 11111111 11111001
—>不需要转化,这就是最终结果