(-2147483648 > 0)?

-2147483648 是最小的整数(32位)。但是:

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

打印出来的是"true"。你知道其中的原因吗?

  -2147483648 不是一个数(number)。C++语言不支持负数字面值常量(literal value).-2147483648 实际上是一个表达式:在整数字面值常量 2147483648 前面加上一个一元运算符 - 。
2147483648 很显然已经超出了 int 的整数范围 (-2147483648,2147483647),如果 long int 能表达更大的范围,编译器将会自动假定 2147483648 为 long int 类型。(在C++11中被认定为 long long int 类型)。
  但是,VC上 long int 与 int 都是 32 位的,总之,若没有更大的整形在有些平台上,这意味着 2147483648 超过了所有有符号整形的范围,或者这么说,这种行为是未定义的(undefined)。
  实际上,考虑到上述行为的未定义性,2147483648 可能被解释成独立实现(implementation-dependent)的负数,这个负数通过符号(-)又转换成正数;另外,也有可能通过无符号类型来代表这个值(例如,在C89/90 编译器使用了 unsigned long int ,但是 C99 和 C++ 都不是这样的)。由于这是未定义的行为,所以编译器可以自己实现这种未定义的行为。

补充说明:
我们通常定义一个 INT_MIN 为:#define INT_MIN (-2147483647 - 1)
而不是:#define INT_MIN -2147483648
因为后一种行为可能出现与预期不一样的结果。

原文出自:http://stackoverflow.com/questions/14695118/2147483648-0-returns-true-in-c

posted @ 2014-12-16 19:17  Beenking  阅读(2365)  评论(0编辑  收藏  举报