面试问题中这个位操作代码有什么问题?

Jos*_*osh 25 c c++ bit-manipulation integer-promotion

我正在查看此页面:http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp,并且不明白这个问题:

以下代码可能有什么问题?

long value;
//some stuff
value &= 0xFFFF;
Run Code Online (Sandbox Code Playgroud)

注意:向候选人提供有关他们正在开发的基础平台的提示.如果该人仍然没有发现代码有任何问题,他们就没有C++经验.

有人可以详细说明吗?

谢谢!

Jam*_*lis 41

这里有几个答案说明如果inta的宽度为16位,0xFFFF则为负.这不是真的. 0xFFFF永远不会消极.

一个十六进制文字由第一以下类型的表示,其足够大,以包含它: int,unsigned int,long,和unsigned long.

如果int宽度为16位,则0xFFFF大于a表示的最大值int.因此,0xFFFF是类型unsigned int,保证足够大以表示0xFFFF.

当执行通常的算术转换以进行评估时&,将unsigned int其转换为a long.一个16位的转换unsigned int,以long被明确定义,因为由一个16位的每一个值表示的unsigned int是也是由32位表示的long.

由于初始类型未签名,因此使用0xFFFF的结果与使用结果相同,因此不需要符号扩展0xFFFFL.

或者,如果int宽度大于16位,则0xFFFF属于类型int.这是一个签名但积极的号码.在这种情况下,两个操作数都是有符号的,并且long具有更高的转换等级,因此通过通常的算术转换int再次提升long.


正如其他人所说,你应该避免对有符号操作数执行按位运算,因为数值结果取决于符号的表示方式.

除此之外,这段代码没有什么特别的错误.我认为这是一个风格问题,value在声明时没有初始化,但这可能是一个挑选级别的评论,并取决于//some stuff被忽略的部分的内容.

也许最好使用固定宽度的整数类型(比如uint32_t)而不是long更大的可移植性,但实际上这也取决于你正在编写的代码和你的基本假设.

  • 你是对的.我打赌一个问这个问题的面试官会被证明是错的.:-) (4认同)
  • @Omnifarious:这很可能.无论哪种方式,我认为这是一个糟糕的面试问题. (4认同)