比特掩盖混乱

时间:2014-09-12 21:18:26

标签: c

当我按位时,我得到了这个结果-4227072和0x7fffff:

  

0b1111111000000000000000

这些是我和&表示的两个值的位代表:

  

-0b10000001000000000000000

     

0b11111111111111111111111

不应该把它们放在一起而不是给它吗?

  

0b10000001000000000000000

感谢。

3 个答案:

答案 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