c – 来自面试问题的这个位操作代码有什么问题?

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

What’s potentially wrong with the following code?

06000

Note: Hint to the candidate about the base platform they’re developing for. If the person still doesn’t find anything wrong with the code, they are not experienced with C++.

有人能详细说一下吗?

谢谢!

这里的几个答案指出,如果int的宽度为16位,则0xFFFF为负。这不是真的。 0xFFFF从不为负。

十六进制文本由以下第一个类型表示,它们足够大以包含它:int,unsigned int,long和unsigned long。

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

当执行通常的算术转换以评估&时,无符号整数被转换为长。 16位无符号整数到长整数的转换是明确定义的,因为每个可由16位无符号整数表示的值也可由32位长表示。

不需要符号扩展,因为初始类型没有签名,使用0xFFFF的结果与使用0xFFFFL的结果相同。

或者,如果int大于16位,则0xFFFF为int类型。它是一个有签名的,但积极的数字。在这种情况下,两个操作数都是有符号的,而long具有较大的转换排名,因此int通过通常的算术转换再次提升为long。

正如其他人所说,你应该避免对有符号操作数执行按位操作,因为数字结果取决于如何表示符号。

除此之外,这个代码没有什么特别的错误。我会认为这是一个风格关注的值不被初始化时,它被声明,但这可能是一个nit选择级别注释,并取决于//一些东西部分的内容被省略。

最好使用固定宽度的整数类型(例如uint32_t),而不是long来获得更大的可移植性,但是这也取决于你写的代码和你的基本假设。

http://stackoverflow.com/questions/4251946/what-is-wrong-with-this-bit-manipulation-code-from-an-interview-question

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 来自面试问题的这个位操作代码有什么问题?