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

#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的转换。

转载于:https://www.cnblogs.com/helloWaston/p/4624543.html

【C++】为什么INT_MIN不是直接写成-2147483648(转载)相关推荐

  1. 为什么INT_MIN不是直接写成-2147483648

    今天在看<深入理解计算机系统>的时候,在p105页作者给出了INT_MIN在标准头文件limits.h中的定义 #define INT_MAX 2147483647 #define INT ...

  2. int 为什么是2147483647_为什么宏INT_MIN要写成-2147483647-1

    <深入理解计算机系统>在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义#define INT_MAX 2147483647 #define INT_MIN (-I ...

  3. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  4. 如何把自己的经历写成小说_《诡秘小说》:读者与作者共同创作,难分真假,午夜不敢独自看!...

    刚刚在这一期的三江上,看到一本非常不错的悬疑作品. <诡秘小说>,作者:弹指一笑间,5级作者. 分类:悬疑-诡秘悬疑. [简介] 作者与读者共同创作,非表面众筹文学. [简评] 本书剧情十 ...

  5. numpy.hstack(a,b) 按列方向扩展 与 numpy.vstack(a,b) 按行方向扩展 其中n*1 数组可以写成 举例 np.array([[1],[2],[3]])

    https://www.jianshu.com/p/608140bec2f5 其中n*1 数组可以写成 举例 np.array([[1],[2],[3]])

  6. 惊呆了!B 站公告低级错误,将公司名写成“百度”

    整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 3月26日上午,哔哩哔哩(简称"B站")在港交所提交公司最新的资料表,然而却被眼尖的网友发现在公司名字处竟出 ...

  7. 12月31日写成13月1日引发重大 Bug,程序员新年就要被“祭天”?

    作者 | 梦依丹 出品 | CSDN(ID:CSDNnews) 元旦假期,宅家免不了要扫地拖地.这不,小白鲸扫地机器人竟然选择了"罢工". 不少用户反馈小白鲸拖地机器人指示灯一直异 ...

  8. c语言115写成16进制,C语言指针问题

    C语言指针问题 來源:互聯網  2009-04-01 16:01:29  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...

  9. 人类第一次将42写成3个整数的立方和,最后一个100以内的自然数告破

    允中 发自 凹非寺  量子位 报道 | 公众号 QbitAI 现在,42也被攻破了. 它可以被写成3个整数的立方之和,这是100以内自然数的最后一个"彩蛋". 荣誉属于麻省理工的A ...

最新文章

  1. Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘
  2. 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)
  3. 高性能SQLServer通用分页存储过程
  4. 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
  5. C# 3.0 New Language Features (Part 2)
  6. Xcode12快捷键配置
  7. 洛谷 P5742、P5743、P5744 题解
  8. Ubuntu runlevel修改
  9. windows 系统更新 WSUS的安装与部属
  10. ImportError: cannot import name main
  11. Stanford机器学习---第六讲. 怎样选择机器学习方法、系统
  12. Vivado 2017封装自定义IP Core
  13. 浏览器重定向(302)次数限制问题
  14. JavaScript正则表达式 1
  15. 基于R实现统计中的检验方法---方差分析
  16. 应用服务Application Services
  17. Win10任务栏图标一直刷新的解决方法
  18. 你执手嫣然入了画幕,我漠然割舍断了归途
  19. 让自己的博客可以在百度上搜索到
  20. GO笔记之为什么要学习GO

热门文章

  1. UITextView详解
  2. 让用户研究插上数据的翅膀
  3. mysqlbinlog工具_MySQL binlog相关分析
  4. 编辑器未包含main类型_利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中...
  5. Hive文件数创建过多的问题
  6. (123)FPGA面试题-介绍低速接口(UART、IIC、SPI),SPI有几根线,每根线的作用?(三)
  7. (82)Verilog HDL:状态机二段式
  8. 服务器多路径 映射分区找不到,设备映射多路径DM-Multipath
  9. STM32中断与事件
  10. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型