**关于原码补码的一点想法**

一些总结
从一开始接触原码补码老师强调的概念都是:正数最高位为0,正数的反码补码都是它本身;负数最高位为1,补码为它的反码加1,符号位保持不变。根据这个概念我总是不能理解为什么-128的补码为10000000。
到后面看了很多优秀文章之后才明白。众所周知,在计算机中,都是以补码的形式进行运算。这里我将以时钟举例,一个时钟分为12个单位,时钟的表示范围则为12,我们将此称为模,-3点(即逆时针旋转3个单位)和+9点(顺时针旋转9个单位)表示的是同一个点。为了好理解我们把补定义为顺时针旋转多少单位能到的位置。所以+3的补为+3,而-3的补为+9,所以(-3)=12-|-3|=+9。我们以八进制为例,它的表示范围即为2^8=256,即模为256。那么(-128)补 =256-|-128|=128=10000000.即一个负数的补码=模-|负数|,这是单纯的根据模来理解。

啰嗦嗦-----------
当我翻起一本微机教材的时候,看见解释如下:计算机中的数用二进制表示,分为有符号数和无符号数。对于有符号数而言,最高有效位为符号位,其余为数值位。对于负数的补码是对该负数相对应的正数的补码按位求反末位加1。例:
【+1】补=00000001
按位求反 11111110
末位加1 11111111
即【-1】补=11111111
补码是存在符号扩展和表数范围问题的,符号扩展原则为正数前添0,负数前添1,,表数范围即为n位补码能表示的范围,一般来说,n位补码表数范围为-2^(n-1) 到2^(n-1)-1 。下面想稍稍谈下计算机怎么用补码进行运算的,举个例子。
例:
-23+(-15)=(-38)
11101001【-23】补
+ 11110001【-15】补
——————————————
1 11011010【-38】补
由此可见,在计算过程中可能出现最高有效位像高位的进位由于机器字长的限制而自动丢失的情况,但是并不影响计算的正确性,是因为机器把这一丢失的进位保留在了微处理器标志寄存器的进位位中。想来,这就是计算机中用补码进行运算的好处之一吧。第一次写,也不知道逻辑严密不,紧脏兮兮的,其实发现把这个想象成一个圆就会好理解很多,顺便也理解了补码的运算。

猜你喜欢

转载自blog.csdn.net/Zyy127586/article/details/84026745