你说的这个也可以使用変号操作,其实原码转换成补码就是変号操作俗称取负。
16位的二进制书写有符号数的范围就是2的15次方至-2的15次方加1,也就是这个32767到
-32768。
1000000000000000(原码)的反码为01111111111111111.
补码就是在反码的个位上加1就是1000000000000000
所以这个32768同-32768二进制数相同。
25+28
0001
1001+0001
1100=0011
0101=(53)10
8位二进制数第一位是符号位是正数的为0,是负数的为1.在求其补码时正数的补码等于其本身,负数的符号位不变,其他位取反,再加1就是这个二进制数的补码。算出的结果再求其补码,将其补码转换成10进制就可以了!
-25-28
1110
0111+1110
0100=1100
1011=1011
0101=(-53)10
唉呀,直接用windows附件里的计算器的二进制,十进制来回转换就是了。要是自己动手去算多麻烦呀。
求补码,一般是先求原码,再取反,再加一,才能求到补码。
其实,“取反加一”只是一个低能的算法而已,并不是求补码根本方法。
补码,是自然生成的,与原码反码毫无关系。
比如,数值 0,在八位计算机中,就是以 0000 0000 来存放。
数值 +1,就是在 0 上加个一,即:0000 0001。
数值 +2,就是在 +1 上再加一,即:0000 0010。
。。。
数值-1,是在 0 的基础上减一,即:1111 1111 (十进制255)。
数值-2,就再减一次一吧,即:1111 1110 (十进制254)。
。。。
其它数值,都是这个规律,不需要谁来设计。
以上这些二进制,就是:整数的补码。
总结:
正数的补码,就是:用十进制,直接转换成二进制。
负数的补码,就是:负数+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 根本就没有原码和反码。
那么,取反加一,就没有用武之地。
因此,凡是说到“取反加一”的答案,都是错误的。
(0111111111111111)二=(32767)十
(1000000000000000)二是补码,最高位1,表示是负数,转换成对应原码是用下面的方法:
(1)原码转换成补码时:把原码的反码再加1,就是补码。
(2)补码转换成原码时:把补码的反码再加1,就是原码。
(1000000000000000)二的数码是(000000000000000)二,它的反码是(111111111111111)二,再加1为:(1000000000000000)二=32768,
所以(1000000000000000)二=(-32768)十(-32768的补码)。
(32768)十的原码为:(1000000000000000)二
(1000000000000000)二的反码是:(0111111111111111)二
(0111111111111111)二,再加1为:(1000000000000000)二
因为是负数,所以最高位为1。
(-32768的补码)是:(1000000000000000)二