按位取反(~)

二进制数在内存中是以补码的形式存放的

1、原码、反码、补码

1.1、正数

  • 原码:符号位0(代表+号),加上数字的二进制形式
  • 正数原码、反码、补码相等

1.2、负数

  • 原码:符号位1(代表-号),加上数字的二进制形式
  • 反码:相对于原码符号位不变,数值位依次取反(0变1,1变0)
  • 补码:相对于原码符号位不变,数值位依次取反,再加1(即补码=反码+1)

1.2、零

  • 0有+0和-0两种形式,分别按照上面的计算即可
+0:
    1. 计算原码:0000
    2. 计算补码:0000(正数原码与补码相同)
    3. 对补码依次取反:1111(取反后数字的补码,由符号位可知为负数)
    4. 取反后数字反码:1110(负数的反码=补码-1)
    5. 取反后数字原码:1001(相对于反码符号位不变,数值位依次取反)
    6. 转化为十进制:-1
    
-0:
    1. 计算原码:1000
    2. 计算反码:1111(相对于原码符号位不变,数值位依次取反)
    3. 计算补码:0000(负数补码=反码+1)
    4. 对补码依次取反:1111(取反后数字的补码,由符号位可知为负数)
    5. 取反后数字反码:1110(负数的反码=补码-1)
    6. 取反后数字原码:1001(相对于反码符号位不变,数值位依次取反)
    7. 转化为十进制:-1

为什么-0的补码是0000?

-0的补码

2、按位取反原理

  • 对数字的补码(即内存中的存储形式),进行依次取反,得到取反后数字的补码,然后将补码转换为原码,再转为10进制数即为按位取反后的数值

示例(以四位二进制为例)

+5:
    1. 计算原码:0101
    2. 计算补码:0101(正数原码与补码相同)
    3. 对补码依次取反:1010(取反后数字的补码,由符号位可知为负数)
    4. 取反后数字反码:1001(负数的反码=补码-1)
    5. 取反后数字原码:1110(相对于反码符号位不变,数值位依次取反)
    6. 转化为十进制:-6
    
-4:
    1. 计算原码:1100
    2. 计算反码:1011(相对于原码符号位不变,数值位依次取反)
    3. 计算补码:1100(负数补码=反码+1)
    4. 对补码依次取反:0011(取反后数字的补码,由符号位可知为正数)
    5. 取反后数字原码:0011(正数原码、反码、补码相同)
    6. 转化为十进制:+3
posted @ 2022-03-21 11:16  这货不是古月先生  阅读(496)  评论(0编辑  收藏  举报