我有这样的代码:
\n#include <iostream>\nusing std::cout;\nusing std::endl;\n\nint main() {\n uint16_t a = 0;\n uint16_t b = 0;\n\n if ( a - b < 3u )\n {\n cout << "cacahu\xc3\xa8te" << endl;\n }\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n当我使用 g++ with 编译它时-Wall
,我得到:
temp.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntemp.cpp:9:13: warning: comparison of integer expressions of different signedness: \xe2\x80\x98int\xe2\x80\x99 and \xe2\x80\x98unsigned int\xe2\x80\x99 [-Wsign-compare]\n 9 | if ( a - b < 3u )\n | ~~~~~~^~~~\n
Run Code Online (Sandbox Code Playgroud)\n如果我改为写入,则不会显示该警告if ( a - b < static_cast<uint16_t>(3u) )
。
那么这里发生了什么事?int 从哪里来?
这里正在进行整数提升。std::uint16_t
在小于 的系统上,当用作(大多数二进制运算的)操作数时,int
它将被提升为。int
两个操作数都a - b
提升为int
,结果int
也是。您将此有符号整数与3u
is进行比较unsigned int
。正如编译器警告您的那样,符号不同。
如果我改为写入,则不会显示该警告
if ( a - b < static_cast<uint16_t>(3u) )
。
这里,右手操作数也被提升为int
。比较双方均已签名,因此不会出现警告。
这实际上会导致不正确的行为吗?
if ( a - b < static_cast<uint16_t>(3u) )
确实有与 不同的行为a - b < static_cast<uint16_t>(3u)
。如果一个是正确的,那么另一个可能是不正确的。
有没有更简单的方法来使其静音?(或者编写 uint16_t 文字的更简洁的方法?)
正确的解决方案取决于您想要正确的行为。
PS 您忘记包含定义的标头uint16_t
。
归档时间: |
|
查看次数: |
475 次 |
最近记录: |