鉴于代码:
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
,我觉得很奇怪!
答案 0 :(得分:0)
您永远不应将签名号码与无符号号码进行比较。添加一个编译器开关来警告你。
在这种情况下,x
将转换为无符号,-1变为SIZE_MAX
(std::size_t
可以容纳的最大数字)。这是因为sizeof
返回一个无符号数(它返回std::size_t
,这是无符号的)
可能发生的另一件事,但在实践中没有发生,如果sizeof(long)>sizeof(std::size_t)
然后sizeof(x)
将被转换为long
,那么你的程序将打印OK
。