-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/