首先建议楼主去恶补一下“原码”、“反码”以及“补码”的相关知识。
以下我就先来分析一下(假设你已经了解了这些知识):
首先我们以无符号的视点来看待题目中的数据:
n = 0x7FFF
m = 0x8000
可知对于n来说,他的二进制模式为:0111 1111 1111 1111
对于m来说,他的二进制模式为: 1000 0000 0000 0000
可以看到,最高位符号位n为0,而m为1
所以用带符号数的视角来看待m、n的这串二进制数据,我们知道n符号位(最高位)为零,所以n是正数,而m符号位为1,因而是负数。
对于补码,正数好计算,就是他的值,也就是0111 1111 1111 1111 = 0x7FFF = 32767
对于负数m,为了知道他的值我们可以这么干:
假设m的绝对值|m| = x,则我们对m就可以得到x
m = 1000 0000 0000 0000
取反:
~m = 0111 1111 1111 1111
加1
~m + 1 = 1000 0000 0000 0000
(这道题数据比较特殊,所以你看到m和~m+1结果貌似一样,事实上你可以列举其他值算算,一般这两个位模式是不同的)
可知x = 32768
则可知m = -x = -32768
以上
具体怎么样的你可以在任何一本c语言书上看到,我讲再清楚都没用。
我给你讲讲自己的理解。 把所有的数字看成时钟上面的数字。
00000000---00000001--00000002.。。。。。一直到FFFFFFFF
FFFFFFFF是-1
我说的是32位有符号数int 用这个时钟概念去理解补码的,我保证你永远不会忘的。
否则光记得 补码=反码+1 反码=原码和FFFFFFFF取异或,这样你在面试的时候迟早要蒙的。
希望对你有帮助。
正数补码=它的2进制。
如5的补码=原码:101;
即0000,0000,0000,1001
负数补码=负数的绝对值的2进制再取反+1;
如-5:
~0000,0000,0000,1001+1
=1111,1111,1111,0110+1
=1111,1111,1111,0111
C语言里面,不涉及补码。
补码是汇编语言中,表示带符号数的。
C语言是高级语言,可以按照人类语言的写法,直接使用正负号,并不需要使用补码。
正数和0的补码永远都是自己,负数的补码就是它的绝对值按位取反,加1。
[0]补=00000000b
[1]补=00000001b
[2]补=00000010b
[3]补=00000011b
----------------
[-0]补=00000000b
[-1]补=11111111b(注:-1的绝对值为1,按位取反后为11111110b,加1就得到了-1的补码:11111111b)
[-2]补=11111110b
[-3]补=11111101b