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

移位计数为负或错误太大-正确的解决方案?

  •  19
  • PeterK  · 技术社区  · 14 年前

    我有以下函数用于读取大端四字(在抽象基文件I/O类中):

    unsigned long long File::readBigEndQuadWord(){
      unsigned long long qT = 0;
      qT |= readb() << 56;
      qT |= readb() << 48;
      qT |= readb() << 40;
      qT |= readb() << 32;
      qT |= readb() << 24;
      qT |= readb() << 16;
      qT |= readb() << 8;
      qT |= readb() << 0;
      return qT;
    }
    

    typedef unsigned char   BYTE;
    typedef unsigned short  WORD;
    typedef unsigned long   DWORD;
    

    问题是,我在shift操作的前四行得到4个编译器警告:

    负值或太大,未定义 行为

    我明白为什么会出现这种警告,但我似乎不知道如何摆脱它 正确地 . 我可以这样做:

    qT |= (unsigned long long)readb() << 56 ;

    这样就消除了警告,但是没有其他问题,字节是否一直正确扩展?也许我只是想得太多了,解决办法就这么简单。你们能帮帮我吗?谢谢。

    2 回复  |  直到 14 年前
        1
  •  16
  •   lc.    14 年前

    你消除警告的方法是正确的。您可能已经知道,出现警告是因为您试图将字节的内容移到单词的边界之外, 然后

    可以说,编译器应该能够确定您要将它存储在四字中,因此它应该首先分配一个四字并在那里进行移位,但它可能没有足够的智能来确定它。

    另外,我不确定这一点,但可能为x64编译这一点也不会产生警告,因为一个字是64位?

        2
  •  2
  •   vijayky88    9 年前

    qT |=(unsigned long long)readb()<<(移位值;63);