MSVC 中带符号和无符号值的比较:了解警告的缺失
在此代码片段中,您会注意到缺少警告具体比较:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
这提出了为什么要比较有符号的问题使用 == 进行比较时,无符号值不会触发警告,而其他比较(、=)则会触发警告。
后台提升和C4018
您预计此比较会因后台升级而产生警告。然而,最后两个例子反驳了这个逻辑:
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
转换规则
当比较有符号和无符号值时,编译器遵循 C 中概述的特定转换规则标准。对于相等比较 (==),操作数有符号还是无符号并不重要,因为结果始终是布尔值(true 或 false)。
但是,对于其他比较,有符号值会被转换至未签名。这种转换很重要,因为它会影响比较结果。例如,在以下语句中:
-1 > 2U
结果为 true,因为 -1 被转换为一个大的无符号正整数,从而导致正确的比较。
MSVC 警告级别
MSVC 选择抑制有符号/无符号相等比较的警告是有意的。根据开发人员的说法,使用 == 比较有符号和无符号值通常会产生直观的结果。例如,无论有符号还是无符号,-1 == -1 都是 true。
另一方面,在有符号/无符号上涉及大于 (>) 或小于 (
以上是为什么 MSVC 不对有符号/无符号相等比较 (==) 发出警告,但对其他比较发出警告?的详细内容。更多信息请关注PHP中文网其他相关文章!