最近在编程中遇到一个问题:

#include <iostream>

using namespace std;

int main()
{
int n = -2147483648;
//cout << (1 > -2147483648) << endl; return 0;
}

使用VS2012编译提示:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

使用g++编译提示:

test.c:7:2: warning: this decimal constant is unsigned only in ISO C90 [enabled
by default]

在网上搜索,发现VS之前的版本提示的是warning,而到了VS2012版本就直接提示为error,加强了严重性。

实际上,当程序员尝试表达最小整数值 -2147483648 时,会发生此问题。 该值不能写为 -2147483648,因为表达式处理分两个步骤:

1. 计算数字 2147483648。 因 2147483648 大于最大整数值 2147483647,所以其类型不是 int,而是 unsigned int。

2. 将一元负应用于该值,得到无符号结果,该结果碰巧是 2147483648。

而这种隐含转换的无符号类型的结果可能导致意外行为,所以编译器会提示waring甚至在VS2012中直接提示error。

关于导致的意外行为,参看上述代码注释行: cout << (1 > -2147483648) << endl;

因为-2147483648会被转换为unsigned即2147483648,同时在比较中1也会被提升为unsigned,从而得到结果0,而这行代码我原意是比较两个int数,结果预计为1。

如何避免出现编译器提示waring甚至是error?

1. 使用limits.h中宏定义的INT_MIN。那为什么使用了该宏定义就不提示了呢?具体看其定义:

#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */

不是直接给出-2147483648的常量来避免;

2. 根据上述提示,因而给int变量赋最小int值时,也可以使用 n = -2147483647 - 1 或者你想特立独行的搞个 n = -2147483646 - 2,只要不直接出现-2147483648就不会出现unsiged的转换。

【C++】为什么INT_MIN不是直接写成-2147483648(转载)的更多相关文章

  1. CSS Icon 项目地址 小图标-用css写成的

    http://cssicon.space/#/icon/focus 这是所有用css写成的  小图标  右侧有 html和css代码

  2. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  3. ASP.NET的一次奇遇:UserControl写成Control引发的w3wp进程崩溃

    昨天在写代码中一不小心将UserControl写成了Control,将原来应该继承自System.Web.UI.UserControl的用户控件,比如下面的BlogStats: <%@ Cont ...

  4. Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable

    最近在改公司的订单系统,遇到了一个奇怪的问题.C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按 ...

  5. 使用gfortran将数据写成Grads格式的代码示例

    使用gfortran将数据写成Grads格式的代码示例: !-----'Fortran4Grads.f90' program Fortran4Grads implicit none integer,p ...

  6. 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

    游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...

  7. Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库

    前两天有人私信我,让我爬这个网站,http://bbs.baobeihuijia.com/forum-191-1.html上的失踪儿童信息,准备根据失踪儿童的失踪时的地理位置来更好的寻找失踪儿童,这种 ...

  8. Selenium爬取电影网页写成csv文件

    绪论 首先写这个文章的时候仅仅花了2个晚上(我是菜鸟所以很慢),自己之前略懂selenium,但是不是很懂csv,这次相当于练手了. 第一章 环境介绍 具体实验环境 系统 Windows10教育版 1 ...

  9. indexOf刚开始写成IndexOf出错

    {{# if(d.fronturlmin ==null||d.fronturlmin ==""){ }} <img src="@System.Configurati ...

随机推荐

  1. docker和宿主机之间复制文件

    从主机复制到容器sudo docker cp host_path containerID:container_path 从容器复制到主机sudo docker cp containerID:conta ...

  2. ajax 向后台数组解决;

    $.ajax({ traditional: true//这个设置为true,data:{"steps":["qwe","asd"," ...

  3. git 远程服务器创建项目自动化部署、克隆推送免密码

    1.用git用户 在git目录下 创建裸仓库 git init --bare project_01.git 2.在裸仓库的 hooks目录下创建 post-receive 文件775 3.post-r ...

  4. 2019-6-23-win10-uwp-未给任务-GenerateAppxPackageRecipe-的必需参数-AppxManifestXml-赋值

    title author date CreateTime categories win10 uwp 未给任务 GenerateAppxPackageRecipe 的必需参数 AppxManifestX ...

  5. LA3905 Meteor

    https://vjudge.net/problem/UVALive-3905 计算出每个点在相框中的时间段,扫描线做即可 关键在如何快速计算每个点在相框中的时间段.对每个点进行运动分解,进入的时间L ...

  6. Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...

  7. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...

  8. bzoj 1123 [POI2008]BLO——点双连通分量

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 点双连通分量缩点,然后各种各样. 结果不会写了.比如新连边.记录一个点是割点缩成的点还 ...

  9. Wamp Apache 启动失败检测方法

    一般情况下,看错误日志就可以解决.如果遇到错误日志看不到的情况,不放试试下面的方法 //无错误日志解决办法cmd命令行切换到C:\wamp\bin\apache\apache2.4.9\bin目录 输 ...

  10. angular 项目迭代+记录采坑

    年中的时候 正在做的项目来了新的领导 给我们的NG4项目来了一次大整顿. 我们公司项目基本都是敏捷开发--> 开发出一个成熟的shared目录(里面有所有的公用组件 公用服务 公用工具类) 然后 ...