博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(-2147483648 > 0)?
阅读量:4560 次
发布时间:2019-06-08

本文共 952 字,大约阅读时间需要 3 分钟。

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

if (-2147483648 > 0)    std::cout << "true"; // print trueelse    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

转载于:https://www.cnblogs.com/bestheart/p/4167852.html

你可能感兴趣的文章
【NOIP1999】【Luogu1015】回文数(高精度,模拟)
查看>>
Linux上安装Python3.5
查看>>
crt安装
查看>>
git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git
查看>>
c++中static的用法详解
查看>>
转 我修改的注册表,但是程序运行起来,还是记着以前的
查看>>
图片轮播功能
查看>>
第六周小组作业:软件测试和评估
查看>>
linux Cacti监控服务器搭建
查看>>
debian(kali Linux) 安装net Core
查看>>
centos 7防火墙设置
查看>>
自定义进度条(圆形、横向进度条)
查看>>
spark-streaming-kafka采坑
查看>>
9.Mongodb与python交互
查看>>
18-[JavaScript]-函数,Object对象,定时器,正则表达式
查看>>
读取短信回执
查看>>
EF 数据初始化
查看>>
PreparedStatement与Statement
查看>>
WebService -- Java 实现之 CXF ( 使用CXF工具生成client 程序)
查看>>
Android学习--网络通信之网络图片查看器
查看>>