当我按位时,我得到了这个结果-4227072和0x7fffff:
0b1111111000000000000000
这些是我和&表示的两个值的位代表:
-0b10000001000000000000000
0b11111111111111111111111
不应该把它们放在一起而不是给它吗?
0b10000001000000000000000
感谢。
答案 0 :(得分:4)
-4227072 == 0xFFBF8000 == 1111 1111 1011 1111 1000 0000 0000
-4227072 & 0x7fffff
应该是
0xFFBF8000 == 1111 1111 1011 1111 1000 0000 0000 0000
& 0x7fffff == 0000 0000 0111 1111 1111 1111 1111 1111
-----------------------------------------------------
0x003F8000 == 0000 0000 0011 1111 1000 0000 0000 0000
答案 1 :(得分:2)
负数表示为计算机内存中的2's complement。您发布的二进制表示因此具有误导性。在2的补码中,最高有效位(位 k )的值为-2 k-1 。剩下的数字是你想象的正数。
假设您正在处理32位有符号整数,我们有:
1111 1111 1011 1111 1000 0000 0000 0000 = −422707210 & 0000 0000 0111 1111 1111 1111 1111 1111 = 7fffff16 ———————————————————————————————————————————————————————————— 0000 0000 0011 1111 1000 0000 0000 0000
你得到了什么。
验证第一行:
−1 × 231 = −214748364810 1 × 230 = 107374182410 1 × 229 = 53687091210 1 × 228 = 26843545610 1 × 227 = 13421772810 1 × 226 = 6710886410 1 × 225 = 3355443210 1 × 224 = 1677721610 1 × 223 = 838860810 1 × 221 = 209715210 1 × 220 = 104857610 1 × 219 = 52428810 1 × 218 = 26214410 1 × 217 = 13107210 1 × 216 = 6553610 1 × 215 = 3276810 —————————————————————————————— −422707210 ✓
答案 2 :(得分:1)
0b10000001000000000000000
是正确的 - 如果您的整数编码是signed-magnitude。
这在一些早期或新颖的机器上是可行的。 Another answer很好地解释了负整数通常如何表示为2的补数,然后结果就像你观察到的那样:0b1111111000000000000000
。