为什么x被提升为unsigned int?

时间:2017-07-01 08:41:28

标签: c

鉴于代码:

int main(void) {
    long x = -1;
    if (x < sizeof(x)) {
        printf("OK\n");
    }
    else {
        printf("Not Ok\n");
    }
    return 0;
}  

打印:

Not Ok

我已经阅读了关于通常的算术转换,并且根据我的理解,如果我们对具有不同数据类型的两个操作数进行比较,则编译器在操作数上调用数据强制,该操作数比另一个操作数更窄,这将转换将sizeof(x)转换为unsigned int以匹配其他操作数,是否有任何想法?

问题: 我尝试在比较表达式中将size(x)转换为int

if(x < (int) size(x))

打印Ok,我觉得很奇怪!

1 个答案:

答案 0 :(得分:0)

您永远不应将签名号码与无符号号码进行比较。添加一个编译器开关来警告你。

在这种情况下,x将转换为无符号,-1变为SIZE_MAXstd::size_t可以容纳的最大数字)。这是因为sizeof返回一个无符号数(它返回std::size_t,这是无符号的)

可能发生的另一件事,但在实践中没有发生,如果sizeof(long)>sizeof(std::size_t)然后sizeof(x)将被转换为long,那么你的程序将打印OK