14

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

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

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

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

有没有long可能在目标架构上可能只有 2 个字节,而您可能会丢失符号位?或者也许 0xFFFF 是一个int并且int只有 2 个字节?

提前致谢。

4

6 回答 6

15

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

例如考虑以下程序:

#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
于 2010-03-01T23:57:43.813 回答
7

很难知道面试官希望你说什么。我们只需要猜测。

我的猜测是,在某些架构上,0xFFFF 将是有符号的 16 位值,而 long 是有符号的 32 位值。当您扩展常量以使其可用于屏蔽长值时,将进行符号扩展并变为 0xFFFFFFFFl,这根本不是您想要的。

附录:所写的代码在我目前使用的所有三个编译器上都能正常工作,所以这确实是一个试图弄清楚面试官意图的猜谜游戏。符合标准的 16 位编译器也会生成正确的代码,所以我们只能猜测是否遗漏了什么,示例是否实际上没有损坏,或者面试官是否曾经使用过将 0xFFFF 视为 0xFFFF 的 16 位编译器强制将其扩展为长时的有符号数量。问他会很有趣。

于 2010-03-01T22:43:03.030 回答
1

我可以说,除非知道周围代码的上下文或意图,否则这段代码没有任何问题!

于 2010-03-01T22:48:51.860 回答
0

这可能是在黑暗中的一个镜头,但假设 long vs int 不是问题(其他人已经发布了答案回答这个问题)并且0xFFFF包含类型所需的全部数量,这不只是在制作value = 0xFFFF吗?不需要位操作吗?位操作不是多余的吗?

我唯一能看到的另一件事是,提问的人是否希望您意识到仅使用 0xFFFF 不会影响 long 中包含的缺失数据。

对我来说,根据这里的问题是如何提出的,或者这很明显我们都在思考它:)

于 2010-03-01T23:15:30.827 回答
0

我怀疑我们都想太多了。

这段代码的问题是没有初始化值。问题是 - 您是否意识到 &= (或 += , -= /= 等)在用于统一值时毫无意义?

如果 value 已初始化,则行为已明确定义。保留最低有效 16 位,其余位清零

于 2010-03-02T00:04:35.033 回答
-1

对我来说,这听起来像是 Big-Endian 与 Little-Endian。 http://en.wikipedia.org/wiki/Endianness

于 2010-03-01T22:42:19.293 回答