代码之家  ›  专栏  ›  技术社区  ›  matcheek

python中的有符号位算术

  •  0
  • matcheek  · 技术社区  · 14 年前

    我被下面的python代码卡住了

    >>> a = 0xff
    >>> b = 1 << 8
    >>> ~a & ~b
    -512
    

    为什么是-512?在二进制表示法中,它应该如下所示:

         a   0 1111 1111   -> 255
         b  01 0000 0000   -> 256
    
        ~a   1 0000 0000   -> -256
        ~b  10 1111 1111   -> -257
    
      ~a&~b 00 0000 0000   -> 0
    

    我期望0与C中的签名int相同:

    signed int a = 0xff;
    signed int b = 1 << 8;  
    signed int k = ~a & ~b;
    

    有什么帮助吗?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Tim Pietzcker    14 年前

    为方便起见,假设16位整数(32或64位的原则不变):

    a  = 0xff = 0000 0000 1111 1111
    ~a = -256 = 1111 1111 0000 0000
    
    b  = 1<<8 = 0000 0001 0000 0000
    ~b = -257 = 1111 1110 1111 1111
    
    -256 = 1111 1111 0000 0000
    -257 = 1111 1110 1111 1111
    --------------------------  &
    -512 = 1111 1110 0000 0000