abs(-2147483648)的结果是-2147483648,不是吗?这似乎是不可接受的.
printf("abs(-2147483648): %d\n", abs(-2147483648));
Run Code Online (Sandbox Code Playgroud)
输出:
abs(-2147483648): -2147483648
Run Code Online (Sandbox Code Playgroud) 当我遇到一些我觉得奇怪的行为时,我正在研究一个嵌入式项目.我设法在键盘上重现它(见下文)以确认,但我的机器上没有任何其他C编译器可以在它们上进行尝试.
场景:我有一个#define32位整数可以容纳的最负值,然后我尝试使用它来与浮点值进行比较,如下所示:
#define INT32_MIN (-2147483648L)
void main()
{
float myNumber = 0.0f;
if(myNumber > INT32_MIN)
{
printf("Everything is OK");
}
else
{
printf("The universe is broken!!");
}
}
Run Code Online (Sandbox Code Playgroud)
键盘链接:http://codepad.org/cBneMZL5
对我来说,看起来这个代码应该可以正常工作,但令我惊讶的是它打印出来The universe is broken!!.
此代码隐式地将其转换INT32_MIN为a float,但事实证明,这会导致浮点值为2147483648.0(正!),即使浮点类型完全能够表示-2147483648.0.
有没有人对这种行为的原因有任何见解?
代码解决方案:正如Steve Jessop在他的回答中提到的,limits.h并且已经stdint.h包含正确的(工作)int范围define,所以我现在使用这些而不是我自己的#define
问题/解决方案解释摘要:鉴于答案和讨论,我认为这是对正在发生的事情的一个很好的总结(注意:仍然阅读答案/评论,因为它们提供了更详细的解释):
longS,SO大于任何值LONG_MAX且小于或等于ULONG_MAX随后L后缀的类型为unsigned long(-2147483648L)实际上是-一个unsigned …在Visual Studio 2010上的以下程序
#include <iostream>
using std::cout;
int main()
{
cout << -2147483646 << '\n';
cout << -2147483647 << '\n';
cout << -2147483648 << '\n'; // numeric_limits<int>::min()
cout << -2147483649 << '\n';
cout << -2147483650 << '\n';
cout << "..." << '\n';
cout << -4294967293 << '\n';
cout << -4294967294 << '\n';
cout << -4294967295 << '\n'; // -numeric_limits<unsigned int>::max()
cout << -4294967296 << '\n';
cout << -4294967297 << '\n';
}
Run Code Online (Sandbox Code Playgroud)
生成以下输出
-2147483646
-2147483647
2147483648
2147483647
2147483646
...
3
2 …Run Code Online (Sandbox Code Playgroud) 当我在使用GCC of MinGW编译的Windows7 x64下运行以下代码时,结果似乎是下溢的:
cout<<-2147483648 ; //Output: 2147483648
Run Code Online (Sandbox Code Playgroud)
但是当我将它分配给整数变量时,或者只是简单地将其转换为int类型:
cout<<(int)-2147483648 ; //Output: -2147483648
Run Code Online (Sandbox Code Playgroud)
那么,我的代码的先前版本出了什么问题?我不是int类型吗?或整数的下界究竟是什么?非常感谢.