[英]Why comparison of 40 is less than or equal to -2147483648 true?
我正在使用 Visual Studio 2019 在我的 IDE 上运行以下代码:
cout << (40 <= -2147483648) << endl;
40
和-2147483648
都在signed int
的范围内,所以应该没有上溢或下溢。
我预计 output 是假的。
但是,output 是真的。
为什么?
这是编译器的非标准功能(又名“错误”)。
C++ 标准要求十进制文字应具有以下类型之一:
int
long int
long long int
编译器应该使用第一种可以表示有问题的值的类型。
但是,您的编译器使用无符号类型,这与标准相矛盾。
幸运的是,可以使用/std:c++latest
编译器选项禁用此行为(您应该始终使用它,除非您有特定的理由不这样做)。
请注意,Microsoft 编译器不会使用/std:c++14
和/std:c++17
开关禁用这种非标准行为,尽管在这些版本的标准中对文字类型的要求是相同的。 只有/std:c++20
或/std:c++latest
开关有效。
如果选择了非标准行为,并且警告级别设置为/W2
或更高,编译器将警告您将一元减号应用于无符号值。 始终启用编译器警告并将其视为错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.