期中计组考完后,虽然成绩惨不忍睹,但暴露了一些一直以来不懂但又没暴露出来的问题,在此总结。
补码
Select the two’s complement negation of the following binary value: 00110011:
从以下选项选择00110011的two’s complement negation(不知咋翻)
(a) 11001100
(b) 11001101
(c) 10110011
(d) 11110011
看到这里,了解补码的人会疑惑,我们一般认为的补码(two’s complement)是以下这两条规则:- 正数补码是其本身
- 负数的补码是其本身取反(除去符号位)加1,例如如下步骤
0x100…..0010(-2) -> 0x111…1101 -> 0x111…1110
但本题的two’s complement negation显然不是如上的意思,我可以翻译为-00110011 = ?(没错就是取负数)
C语言在计算机内是怎么取负呢?我认为是取反(包括符号位)再加1,就拿此题为例:
00110011 -> 11001100 -> 11001101,所以选b。
由此可以看出,c语言中取负操作无论正负都是取反(包括符号位)再加1
- 下面我们再看一个例子:
In two’s compliment, what is -TMin-1?