原码、反码和补码
- 原码:5=>0b101 1=>0b1 假设计算机用原码表示负数:-1=>-0b1,但是计算机只有0和1,无法识别符号,由于数据总是有边界的,比如int占4字节,32位,则在最高位上,用0和1表示正符号,则有符号的int型范围是2^31-1,所以计算机表示负数的方式是用最高位表示符号
- 反码:正数的反码与原码相同,负数的反码符号位不变,其余按位取反
- 补码:正数的补码与原码相同,负数的反码符号位不变,其余按位取反+1
为什么要用补码呢?
因为逻辑电路设计起来太费劲,既要有加法器还有减法器,但是减法完全可以用加法代替,这种数字游戏可以用补码来做
负数在计算机用补码存储,而正数,原码补码都一样(正数负数在计算机中都是用补码来描述的)
举个例子:
5-1=5+(-1) 直觉上 0b101 - 0b1 = 0b100 =4,其实在计算机中是0b101+0b1111 1111,溢出位舍弃
具体过程:
5 -1
原码 0000 0101 1000 0001
补码 0000 0101 1111 1110+1=1111 1111
于是 5+(-1)即:
0000 0101+ 1111 1111
0000 0001+ 1111 1111=1 0000 0000 溢出位舍弃,结果是 0000 0000
0000 0100+0000 0000=0000 0100=4 (相当于把5拆成两部分加)
那么12的取反~12是多少呢?
首先12=0000 1100 取反是1111 0011 这是计算机能识别的补码,而不是对我们友好的原码,所以需要把他转为原码,即补码的补码为原码,1111 0011的补码是:
取反+1即: 1000 1100+1=1000 1101= -13