原码、反码、补码
好记性不如烂笔头,想当年在大学的时候,这些码都被我斩于马下!谁曾想,它们会来个回马枪,我真的是忘了!
计算机的存储与计算采用数字的补码进行,假设计算机用一个字节(8位)来存储一个数:
- 最高位,即最左边的位,为符号位,“0”表示正数,“1”表示负数
- 正数的原码、反码、补码一致
- 负数的原码最高位为“1”,其余和其对应的正数相同。
- 负数的反码,在其原码的基础上,符号位不变,其余位按位取反。
- 负数的补码,在其原码的基础上,符号位不变,其余位按位取反后,再加1。
- 负数的补码再求补一次,会得到其的原码。
例如:
12:
- 原码:00001100
- 反码:00001100
- 补码:00001100
-12:
- 原码:10001100
- 反码:11110011
- 补码:11110100
计算12-12==>12+(-12)==>00001100+11110100==>100000000==>只能存8位,最左位直接丢弃==>00000000==0
那么,下面的结果是什么呢?
print(~12)
它居然是 -13 。
为什么呢?
解释:
12在计算机以补码形式存放为:00001100==>取反之后==>11110011==>print它==>对计算机来说,这是一个负数的补码==>这个负数的反码是11110010==>这个负数的原码是10001101==>这个负数是 -13