Jos*_*osh 25 c c++ bit-manipulation integer-promotion
我正在查看此页面:http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp,并且不明白这个问题:
以下代码可能有什么问题?
Run Code Online (Sandbox Code Playgroud)long value; //some stuff value &= 0xFFFF;注意:向候选人提供有关他们正在开发的基础平台的提示.如果该人仍然没有发现代码有任何问题,他们就没有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更大的可移植性,但实际上这也取决于你正在编写的代码和你的基本假设.