代码之家  ›  专栏  ›  技术社区  ›  Austin Salonen gmlacrosse

C:左移赋值运算符行为

  •  5
  • Austin Salonen gmlacrosse  · 技术社区  · 16 年前

    我运行的代码有时会产生以下结果:

    UInt32 current;  
    int left, right;  
    
    ...
    
    //sometimes left == right and no shift occurs
    current <<= (32 + left - right);
    
    //this works
    current <<= (32 - right);
    current <<= left;
    

    对于任何值>=32,只移动值%32。框架中是否发生了一些“优化”?

    1 回复  |  直到 16 年前
        1
  •  6
  •   Pavel Minaev    16 年前

    C 3.0语言规范,7.8“轮班操作员”:

    对于预定义的运算符,要移位的位数计算如下:

    • 当x类型为int或uint时,移位计数由低阶5位计数给出。换句话说,移位计数是根据count&0x1F计算的。
    • 当x类型为long或ulong时,移位计数由低阶6位计数给出。换句话说,移位计数是从count&0x3f计算出来的。