1、概念:
- 计算机不管是存储还是计算,其底层都是在执行二进制的补码并非是原码。
- 原码:将十进制的数值的相应类型直接转换为其对应位数的二进制类型(注意:最高位是符号位。0表示它是一个正数,1表示它是一个负数)。
- 反码:正数的反码与原码相同;负数是除了最高位符号位不变以外,其余位全部取反,“0”->“1”,“1”->“0”。
- 补码:正数的补码与原码相同;负数的补码是在其反码的基础上加“1”。
2、例子
本文以int类型(占4个字节即32位)的十进制数为例:
十进制数(正数):
1
源码:00000000 00000000 00000000 00000001
反码:00000000 00000000 00000000 00000001
补码:00000000 00000000 00000000 00000001
十进制数(负数):
-1
源码:10000000 00000000 00000000 00000001
反码:111111111 111111111 111111111 111111110
补码:111111111 111111111 111111111 111111111
正数取反(是对其数字本身的补码取反后当做~2的补码):~2
2
原码:00000000 00000000 00000000 00000010
反码:00000000 00000000 00000000 00000010
补码:00000000 00000000 00000000 00000010
~2
补码:111111111 111111111 111111111 111111101
反码:111111111 111111111 111111111 111111100
原码:10000000 00000000 00000000 00000011
得到“~2“”的结果为:-3
注意:将2的补码进行取反后得到“~2”的补码,然后将这个补码减去“1”得到“~2”的反码,最后将这个反码取反得到“~2”的原码。
负数取反:~(-2)
-2
原码:10000000 00000000 00000000 00000010
反码:111111111 111111111 111111111 111111101
补码:111111111 111111111 111111111 111111110
~(-2)
补码:00000000 00000000 00000000 00000001
反码:00000000 00000000 00000000 00000001
原码:00000000 00000000 00000000 00000001
得到“”~(-2)“”的结果为:1