c++ - (-2147483648> 0) 在 C++ 中返回 true?

标签 c++ types literals integer-overflow

-2147483648是32位整数类型的最小整数,但是在if(...)这句话中好像会溢出:

if (-2147483648 > 0)
    std::cout << "true";
else
    std::cout << "false";

这将在我的测试中打印 true。但是,如果我们将 -2147483648 转换为整数,结果会有所不同:

if (int(-2147483648) > 0)
    std::cout << "true";
else
    std::cout << "false";

这将打印 false

我很困惑。谁能解释一下?


2012 年 2 月 5 日更新:

感谢您的评论,在我的编译器中,int 的大小是 4 个字节。我正在使用 VC 进行一些简单的测试。我已更改问题中的描述。

这篇文章中有很多非常好的回复,AndreyT非常详细地解释了编译器将如何处理此类输入,以及如何实现这个最小整数。 qPCR4vir另一方面,给出了一些相关的“好奇心”以及整数的表示方式。太令人印象深刻了!

最佳答案

-2147483648 不是“数字”。 C++ 语言不支持负文字值。

-2147483648 实际上是一个表达式:一个正的文字值 2147483648 前面带有一元 - 运算符。值 2147483648 显然对于您平台上 int 范围的正面而言太大了。如果类型 long int 在您的平台上具有更大的范围,编译器将不得不自动假定 2147483648 具有 long int 类型。 (在 C++11 中,编译器还必须考虑 long long int 类型。)这将使编译器在较大类型的域中评估 -2147483648 和正如人们所期望的那样,结果将是负面的。

但是,显然在您的情况下 long int 的范围与 int 的范围相同,并且通常没有大于 范围的整数类型int 在您的平台上。这正式意味着正常量 2147483648 会溢出所有可用的有符号整数类型,这反过来意味着您的程序的行为是未定义的。 (语言规范在这种情况下选择了未定义的行为,而不是要求诊断消息,这有点奇怪,但事实就是这样。)

在实践中,考虑到行为未定义,2147483648 可能会被解释为一些依赖于实现的负值,在应用一元 - 后恰好变为正值给它。或者,某些实现可能决定尝试使用无符号类型来表示值(例如,在 C89/90 中编译器需要使用 unsigned long int,但在 C99 或 C++ 中则不需要)。允许实现做任何事情,因为无论如何行为是未定义的。

顺便说一句,这就是为什么像 INT_MIN 这样的常量通常被定义为

#define INT_MIN (-2147483647 - 1)

而不是看起来更直接的

#define INT_MIN -2147483648

后者不会按预期工作。

关于c++ - (-2147483648> 0) 在 C++ 中返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695118/

相关文章:

java - 为什么 1_2_3_4 在 java 中是有效的整数文字?

c++ - 我可以克隆 C++ 对象的字节,覆盖原始字节,然后将这些字节复制回来吗?

c++ - 引用与信息隐藏 C++

c++ - 预递增字符串文字

ios - 我如何从 SEL 中获取参数类型

scala - 从不同类运行通用功能的最佳方式

c++ - 跨shared_ptr的dynamic_cast?

具有位置的大型排序集合的 C# 数据类型?

c# - 用 001 和 1 初始化 int 有区别吗?

javascript - Array(5) 是否等同于 var a = []; a.长度=5;在 JS 中?