我算出来应该是(11000000000000000)!一共17位。可是书上写的是(1000000000000000),它书上到底是怎么算的?补充:我是在C语言书上看到的,书上讲16位有符号int型取值范围是-32768到32767!急......这里先谢谢回答者了!
求补码,常说的是先求原码,再取反,再加一,才能求到补码。
其实,“取反加一”只是一个低能的算法而已,并不是求补码根本方法。
补码,是自然生成的,与原码反码毫无关系。
比如,数值 0,在八位计算机中,就是以 0000 0000 来存放。
数值 +1,就给 0 加个一,即:0000 0001。
数值 +2,就再加一次一,即:0000 0010。
。。。
数值-1,你就给 0 减一,即:1111 1111 (十进制255)。
数值-2,就再减一次一,即:1111 1110 (十进制254)。
。。。
其它数值,也都是这个规律,递增递减而已,不用特别的设计。
以上这些二进制,就是:整数的补码。
总结:
正数的补码,你就用十进制,直接转换成二进制。
零的补码,就是:一串 0 而已。
负数的补码,就是:负数+256。
一般化,就是:负数+2^n,n 是位数。
--------------------------
如果 n = 16,2^16 就是 65536。
那么,[-32768]补 = -32768 + 65536
= 32768
= 1000 0000 0000 0000 (二进制)
而,[+32767]补 = 32767
= 0111 1111 1111 1111 (二进制)
楼主所疑惑的两个补码,就是这么求出来的。
--------------------------
补码,就是自然生成的,与原码反码,毫无关系。
况且,在 n = 16 时,-32768 根本就没有原码和反码。
那么,取反加一,就没有用武之地。
因此,凡是用“取反加一”求补码的答案,都是错误的。