提问者:小点点

int到无符号int的自动转换


#include <iostream>
using namespace std;

int main() {
    unsigned int u = 5;
    int x = -1;
    if(x>u) {
        cout<<"Should not happen"<<endl;
    } else {
        cout<<"Ok"<<endl;
    }
}

此代码输出不应发生。 我在比较一个字符串(size_t是一个无符号int或无符号long long值)与int的大小时遇到了这个问题。 似乎C类型将int强制转换为无符号int,但实际上,它似乎会带来错误。 老实说,考虑到int与无符号int的不兼容程度,我更希望出现编译时错误。 我想知道为什么公约是这样的?


共1个答案

匿名用户

您可以在clang中启用-wsign-compare-werror:联机尝试!

它将产生编译时错误(因为-werror将警告视为错误):

.code.tio.cpp:7:9: error: comparison of integers of different signs: 'int' and 'unsigned int' [-Werror,-Wsign-compare]
    if(x>u) {
       ~^~
1 error generated.

由于某种原因,Clang中的-wall-werror(而不是GCC中的)不会产生任何错误。 但是-wall-wextra-werror确实包含-wsign-compare,所以您可以使用它。