我正在寻找一个涉及按位操作的考试,并找到了一个有用的页面,我感到很困惑。 http://www.cs.cmu.edu/afs/cs/academic/class/15213-f05/lectures/class03.txt
具体问题出现在“拼图”下的页面底部。给定有符号整数x,并假设32位字大小和2的补码,我们如何显示
x * x <0?
他们列出50000作为可能的解决方案,我不知道为什么或如何运作。
我尝试从3 * 3 = 9,0011 * 0011 = 1001开始。 移动到2个半字节,0010 0001 * 0010 0010 = 34 * 34 = 1156 = 100 [1000 0100] 并且我发现我发现了一种增加1位间隔的模式,但是当我接近32位时它不起作用。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
在2的补码中,最重要的位表示数字的符号。如果你使用正数进行算术运算,最终会进入该特定位,那么你最终会得到一个负数。
例如:
50 000 = 0b00000000000000001100001101010000
50 000 * 50 000 = 0b10010101000000101111100100000000
最高有效位设置为1,因此现在当解释为有符号值时,结果数被视为负数。
以下是上述实践的快速演示:https://ideone.com/TU049L