我只是要经历一堆C++面试问题,以确保没有任何明显的我不知道.到目前为止,我还没有找到任何我不知道的东西,除了这个:
long value;
//some stuff
value &= 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
问题是"这段代码出了什么问题?" 并暗示这与目标架构有关.
除非答案只是"价值未初始化",否则我看不出任何问题.据我所知,它只是掩盖了值的2个最低有效字节,并且long保证至少为2个字节,因此没有问题.
可能是long目标架构上可能只有2个字节,你可能会丢失符号位吗?或者也许0xFFFF是一个int而且int只有2个字节?
提前致谢.
Din*_*ngo 15
此代码的问题在于它对签名值执行逐位操作.对于负值的这种操作的结果对于不同的整数表示而言变化很大.
例如,考虑以下程序:
#include <iostream>
int main(void)
{
long value;
value = -1; // Some stuff
value &= 0xffff;
std::cout << "Value = " << value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在二进制补码架构上,结果是:
Value = 65535
Run Code Online (Sandbox Code Playgroud)
在一个补充架构上,结果是:
Value = 65534
Run Code Online (Sandbox Code Playgroud)
在符号和大小的架构上,结果是:
Value = 1
Run Code Online (Sandbox Code Playgroud)
很难知道面试官希望你说些什么.我们只需要猜测.
我的猜测是,在某些体系结构中,0xFFFF将是带符号的16位值,而long是带符号的32位值.当你扩展常量以便它可以用来屏蔽long值时,会被符号扩展并变成0xFFFFFFFFl,这根本不是你想要的.
附录:所写的代码在我目前使用的所有三个编译器上都能正常工作,所以这确实是一个猜测游戏,试图找出面试官的意图.符合标准的16位编译器也会生成正确的代码,因此我们不得不猜测是否存在遗漏的内容,示例是否实际上没有被破坏,或者访问者是否曾使用过将16FF编译器视为0xFFFF的编译器强制将其延长至long时的签名数量.问他时会很有意思.
| 归档时间: |
|
| 查看次数: |
2809 次 |
| 最近记录: |