来猜猜这四行C++代码的结果
2022-02-14 23:01
本文共约 532 字
预计阅读时间约 2 分钟
若非对数值计算有较扎实理解的,估计都难以一下说出准确答案。
不过,还是建议大家仔细想想,再继续往后翻……
为方便大家拷贝代码进行测试,我把代码以文本形式列出:
1#include <iostream>
2
3int main()
4{
5 auto a = uint16_t(1) - uint16_t(2);
6 auto b = uint32_t(1) - uint32_t(2);
7 std::cout << a << std::endl;
8 std::cout << b << std::endl;
9 return 0;
10}直接公布答案吧,运行结果是:
-1 4294967295
为什么同样是在无符号整数类型变量中,进行了一个下溢出的减法,结果却完全不同呢?
原因就在于 C/C++ 对不同整数类型的处理,以及类型之间的隐含转换。分别解释如下:
1对于 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):
由 https://hackingcpp.com/ 制作。在该网站上,还可以下载到更多类似的总结,有兴趣的不妨翻翻。像 C/C++ 这种讲求长期积累的语言,还是需要从平时的点滴积累做起的。
--- END ---
注:本文首发表于“不靠谱颜论”公众号,并同步至本站。