我编译了以下代码-Wsign-conversion
:
int main()
{
unsigned int a = 8;
int b = a + 8u; // warning: implicit conversion changes signedness: 'unsigned int' to 'int'
int c = a - 8u; // warning: implicit conversion changes signedness: 'unsigned int' to 'int'
int d = a * 8u; // warning: implicit conversion changes signedness: 'unsigned int' to 'int'
int e = a / 8u; // gcc warns, but no warning in clang
}
当从无符号除法的结果进行赋值时,Clang 不会发出警告,但 gcc 会发出警告。
为什么在这一具体案例中存在差异?
Clang 只是多了一点聪明:无符号整数除以大于或等于 2 的无符号整数意味着无符号整数结果将始终适合有符号整数对应项(除法表达式中分子类型的结果)。但是,如果除以值为 1 的无符号整数,则不再保证结果符合有符号整数对应项,并且 Clangdoes发出警告:
#include <cstdint>
int main() {
uint8_t a = 240; // '240 / 1' will not fit in int8_t
int8_t e = a / 2u; // No warning in clang
int8_t f = a / 1u; // warning: implicit conversion changes signedness: 'unsigned int' to 'int8_t' (aka 'signed char') [-Wsign-conversion]
}
人们还可能会争辩说,Clang 应该能够省略对乘以 0 的类似特殊情况的警告;但是 Clang 不会,而 GCC 会:
// Clang warns, no warning in GCC.
int8_t g = a * 0u;
因此,在这种情况下,Clang 非常聪明。部门和 GCC w.r.t.乘法。
最后,请注意,Clang 在除法期间发出此警告的门限似乎仅在除以 1 时出现,因为您不会得到相同的结果-Wsign-conversion
如果你除以0u
;可以说,因为它已被更相关的内容所覆盖(在这种情况下)-Wdivision-by-zero
警告:
int8_t h = a / 0u;
warning: division by zero is undefined [-Wdivision-by-zero]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)