对原码,反码,补码的一点理解。

这块儿一直迷迷糊糊的,有时做题或应用还会用到,计算机体系结构又没学好,哎。。,简单记录一下,帮助理解记忆吧。

对有符号整型而言,计算机运算采用补码形式,且不考虑符号位,以1byte=8bit为例简单说明。

原码也就是这里的有符号二进制码。

对正数,反码、补码与其原码一样。

对负数,反码是符号位以外的其余各位取反,补码是反码+1,简记为‘取反加1’。

按此规则,原码,反码,补码表示范围如下:

-127, ......, -1 , 0 , 1 , ......, 127

原码:11111111,......,10000001,00000000,00000001,......,01111111

反码:10000000,......,11111110,00000000,00000001,......,01111111

补码:10000001,......,11111111,00000000,00000001,......,01111111

那么问题来了,127+127+1=255, 2^8=256,因为最高为作为符号位了,还有一个数没表示出来,现在的表示范围是-127~127。怎么办呢?

很简单,因为10000000没用上,把它作为原码的话就是-0,没什么意义,跟别提反码了,所以把10000000作为-128的补码,反正运算都是以补码的形式,这样正好表示-128~127共256个数,10000001(-127)减1正好是10000000(-128),这样就完美了。

当然书上有更深入更准确的讲解,具体再行查阅吧。

猜你喜欢

转载自blog.csdn.net/Albert201605/article/details/78995215