繁体   English   中英

为什么比较40小于等于-2147483648为真?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM