版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。As we all know,正数的三码都一样,注意一下最高位为符号位即可;
负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码;负数的反码为它的正数按位取反,也就是说把符号位和数值位都取反,比如4的反码为00000100B,则-4的反码为11111011B,可以看出,8位的二进制数可以表示的反码范围为-127~+127,即10000000B~01111111B;
补码一直都是这一块的难点,经常出一些很边缘的数值来麻痹我们,按照教科书的常规解法为负数的补码最高位为1,其数值部分由它的反码加1形成,如-127的原码为11111111B,则反码为10000000B,所以对一个负数的反码求真值时,符号位不动,7个数值位取反即可;
-127的补码为其反码+1,即10000001B,如果按照常规算法,10000000B和00000000B都表示0(分别为-0和+0),在实际运算时这二者是相等的,秉承不冗余的唯一原则,规定10000000B不再表示-0,而是-128,注意这里是说的补码,即-128的补码为10000000B,我们可以将补码连同符号位看作一个数,只是用最高位加以区别。如-128的最高位为1,表示其为负数,2^7=128,所以它的值为-128,再如-4的补码为11111100B,就相当于-128+(64+32+16+8+4);
当一个数要减去另一个数时,只要加上其反码就可以了,这对于加减运算极其方便,比如7-19,就相当于7+(-19)的补码,即00000111B+11101101B,结果为F4H,这时为补码,转换为原码为-12,结果正确;负数的原码和补码之间的转换如果按照他们三者之间的关系来做的话相当麻烦,很容易出错,这里就有一个好方法,对于原码,从低位到高位遇到第一个‘1’之前保留原数值(包括这个‘1’),之后除符号位外全部取反,这样便得到了该数的补码,反之亦可,大家可以试一下。
—————————————————— 分割线 —————————————————————
最近几篇手绘知识点--指针系列文章阅读量差异较大,比如第二篇耗费大量精力最终木有过百,心凉啊。。。
刚创建了一