【发布时间】:2020-10-26 18:06:29
【问题描述】:
我用-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 会。
为什么在这一特殊情况下会有所不同?
【问题讨论】:
-
这是因为
unsigned int不一定适合int而不会溢出。也许clang有一个不同的标志,或者它足够聪明,知道那些不会溢出。尝试使用合适的值。 -
“对”是什么意思,就C++而言,代码是可以的。警告只是编译器让你知道你可能没有做你正在做的事情的方式
-
另外,除非除数是
1,否则任何除数都会使结果适合int。 -
@NathanOliver 'right' 如 - 除法是否还引入了改变符号的隐式转换?如果是这样 - 与其他 3 个操作不同,是否有理由忽略它?
-
我不确定为什么这个问题被否决了。在一种特定情况下,想知道为什么一个编译器发出警告而不是另一个编译器发出警告是完全合理的。