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

#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. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

    从hibernate3升级到4应该会遇到 应该添加引用 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 ...

  2. java 实现文件内容的加密和解密

    package com.umapp.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...

  3. Puppet基础应用

    Puppet简介 IT基础设施自动化管理工具,作者:Luck Kanies,官方站点:www.puppetlabs.com 管理设施的整个生命周期: provisioning.configuratio ...

  4. springcloud注册中心eureka

    1.前提 springcloud的注册中心是以springboot为基础搭建起来的. 开发工具:IDEA 项目管理工具:maven 2.搭建步骤 创建一个web项目(建议使用IDEA工具构建项目) 修 ...

  5. Django项目:CRM(客户关系管理系统)--55--46PerfectCRM实现登陆后页面才能访问

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  6. bzoj 1800 [Ahoi2009]fly 飞行棋——模拟

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1800 原来只想到一个弧是一条边. 然后发现不是.差点不会做.经Zinn提醒,不用枚举那条边由 ...

  7. SSM4-Linux上jdk、tomcat、zookeeper------tar zxvf的安装

    1.zookeeper .Zookeeper介绍 官方推荐使用zookeeper注册中心. 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发 ...

  8. 常用命令5--文件搜索命令3-find

    发现没有出来install.log.syslog ,find不能进行模糊搜索.要想模糊搜索,必须用通配符. 没有所有者的文件是垃圾文件.但是内核产生文件,在这两个文件夹里文件有可能没有所有者,很正常, ...

  9. birt运行环境

    1.下载 http://pan.baidu.com/s/1nvhz5wt 2.解压birt-runtime-4.6.0-20160607.zip 将WebViewerExample更名为birt,复制 ...

  10. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...