颜林林的个人网站

来猜猜这四行C++代码的结果

2022-02-14 23:01

Image 说实话,上面题图的代码,是很具有迷惑性的。

若非对数值计算有较扎实理解的,估计都难以一下说出准确答案。

不过,还是建议大家仔细想想,再继续往后翻……

为方便大家拷贝代码进行测试,我把代码以文本形式列出:

#include

int main() { auto a = uint16_t(1) - uint16_t(2); auto b = uint32_t(1) - uint32_t(2); std::cout « a « std::endl; std::cout « b « std::endl; return 0; } 直接公布答案吧,运行结果是:

-1 4294967295

为什么同样是在无符号整数类型变量中,进行了一个下溢出的减法,结果却完全不同呢?

原因就在于 C/C++ 对不同整数类型的处理,以及类型之间的隐含转换。分别解释如下:

对于 uint16_t 类型,“uint16_t(1) - uint16_t(2)”会被隐含转换为类型 int,即成为“int(1) - int(2)”,于是结果就成了 -1。

而对于 uint32_t 类型,它与 int 或 unsigned int 属于同一范围层次,因此并不会触发向类型 int 或 unsigned int 的隐含类型转换,结果就保持以无符号整数进行计算,从而得到了 4294967295(即 0xFFFFFFFF)。

上述例子,来自一份“C++’s Usual Arithmetic Conversions”的小抄(Cheat Sheet):

Image

https://hackingcpp.com/ 制作。在该网站上,还可以下载到更多类似的总结,有兴趣的不妨翻翻。像 C/C++ 这种讲求长期积累的语言,还是需要从平时的点滴积累做起的。

--- END ---

注:本文首发表于“不靠谱颜论”公众号,并同步至本站。