原码、反码和补码是几乎所有计算机教材的第一课,很基础也很简单,由于这些内容一直跟二、四、十六进制的转化放在一起,我从来都是跳过这章直接往下看的,直到有一天,我自己被一个超白目的问题难倒了……
”将-3右移2(bit)位,结果是多少?”
一下子,我发现,在过去的学习中我挑食了,现在补上这一课。
原码,是自然数值的机器数表示。具体的表示规则是这样的:最高为作为符号位,剩下的位是数值位。比如-3原码表示为10000011(如图)。原码的数值表示范围跟二进制的位数有关,如8位二进制数最大的表示范围是-127~+127之间(最高位是符号位)。
反码,是机器数运算过程的中间表示形式。具体规则是:正数的反码和原码相同;负数的反码是符号位不变,其他位按位求反得到的。如,-3的补码是11111100。
补码,是机器数的运算表示形式。引入了补码克服了原码的局限性(由于符号位要单独操作,运算方法比较复杂),使得计算减法可以用计算加法的方式得到;补码另外的优点是,数字0补码表示的唯一性。具体的规则是:正数的补码和原码相同;负数的补码是反码末位加1。如,-3的补码是11111101。
然后,运算器对数值进行右移操作,负数补1,正数补0,得到11111111。从符号位看,代表的是负数,还原成原码方法是求补码的补码,得到原码10000001,代表十进制数-1。
![2009022716214319.jpg](https://i-blog.csdnimg.cn/blog_migrate/c1d0751611e4a4547052baec18e19316.jpeg)
总结一下:
正数的原码,反码和补码相同。
负数的反码是原码保持符号位不变,其他位按位求反;补码是反码加1。补码还原是补码的补码。
左移操作即所有的高位舍去(包括符号位),右边(低位)补0;右移操作,所有的低位舍去(右移),高位(左边)负数补1,正数补0。