代码之家  ›  专栏  ›  技术社区  ›  Peter Alexander

对练习面试问题的回答

  •  14
  • Peter Alexander  · 技术社区  · 16 年前

    我只是在通过一系列C++面试问题来确保没有什么是我不知道的。到目前为止,我还没有发现任何我不知道的东西,除了这个:

    long value;
    //some stuff
    value &= 0xFFFF;
    

    问题是“这段代码有什么问题?”并暗示这与目标体系结构有关。

    除非答案是“值未初始化”,否则我看不出任何问题。据我所知,它只是屏蔽了值的2个最低有效字节 long 保证至少有2个字节,所以没有问题。

    可能是这样吗 长的 在目标体系结构上可能只有2个字节,您可能会丢失符号位?或者0xFFFF是一个 int 和 内景 只有2个字节?

    提前谢谢。

    6 回复  |  直到 16 年前
        1
  •  15
  •   Dingo    16 年前

    此代码的问题在于它对有符号值执行逐位操作。对于不同的整数表示,对负值的这种运算的结果差别很大。

    #include <iostream>
    
    int main(void)
    {
        long value;
        value = -1; // Some stuff
        value &= 0xffff;
        std::cout << "Value = " << value << std::endl;
    }
    

    在二元互补体系结构上,结果是:

    Value = 65535
    

    Value = 65534
    

    在符号和量级架构上,结果是:

    Value = 1
    
        2
  •  7
  •   John Knoeller    16 年前

    很难知道面试官希望你说什么。我们只能猜测一下。

    附录: 所写的代码在我目前使用的三个编译器上都能正常工作, 所以这确实是一个猜测游戏,试图弄清楚面试官的意图。一个符合标准的16位编译器也会生成正确的代码,因此我们只能猜测是否有遗漏的内容,这个示例是否事实上没有被破坏,或者面试官是否曾经使用过一个16位编译器,当被迫将0xFFFF扩展到long时,它会将0xFFFF视为一个有符号的量。问他会很有趣的。

        3
  •  1
  •   Arun    16 年前

    我想说的是,除非知道周围代码的上下文或意图,否则本代码中没有错误!

        4
  •  0
  •   Kelsey    16 年前

    这可能是一个黑暗的镜头,但假设长vs int不是问题所在(其他人已经发布了答案来回答这个问题),并且 0xFFFF value = 0xFFFF 不需要进行位操作?位操作不是多余的吗?

    我能看到的另一件事是,如果提问者想让您意识到long中包含的缺失数据不会受到仅使用0xFFFF的影响。

    在我看来,这个问题有点古怪,是基于这个问题是如何呈现在这里的,或者很明显我们都在思考:)

        5
  •  0
  •   pm100    16 年前

    如果值已初始化,则行为定义良好。最低有效的16位被保留,其余的被清零

        6
  •  -1
  •   pbh101    16 年前