【C++】为什么INT_MIN不是直接写成-2147483648(转载)
最近在编程中遇到一个问题:
#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(转载)相关推荐
- 为什么INT_MIN不是直接写成-2147483648
今天在看<深入理解计算机系统>的时候,在p105页作者给出了INT_MIN在标准头文件limits.h中的定义 #define INT_MAX 2147483647 #define INT ...
- int 为什么是2147483647_为什么宏INT_MIN要写成-2147483647-1
<深入理解计算机系统>在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义#define INT_MAX 2147483647 #define INT_MIN (-I ...
- socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- 如何把自己的经历写成小说_《诡秘小说》:读者与作者共同创作,难分真假,午夜不敢独自看!...
刚刚在这一期的三江上,看到一本非常不错的悬疑作品. <诡秘小说>,作者:弹指一笑间,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]])
- 惊呆了!B 站公告低级错误,将公司名写成“百度”
整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 3月26日上午,哔哩哔哩(简称"B站")在港交所提交公司最新的资料表,然而却被眼尖的网友发现在公司名字处竟出 ...
- 12月31日写成13月1日引发重大 Bug,程序员新年就要被“祭天”?
作者 | 梦依丹 出品 | CSDN(ID:CSDNnews) 元旦假期,宅家免不了要扫地拖地.这不,小白鲸扫地机器人竟然选择了"罢工". 不少用户反馈小白鲸拖地机器人指示灯一直异 ...
- c语言115写成16进制,C语言指针问题
C语言指针问题 來源:互聯網 2009-04-01 16:01:29 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...
- 人类第一次将42写成3个整数的立方和,最后一个100以内的自然数告破
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,42也被攻破了. 它可以被写成3个整数的立方之和,这是100以内自然数的最后一个"彩蛋". 荣誉属于麻省理工的A ...
最新文章
- Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘
- 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)
- 高性能SQLServer通用分页存储过程
- 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
- C# 3.0 New Language Features (Part 2)
- Xcode12快捷键配置
- 洛谷 P5742、P5743、P5744 题解
- Ubuntu runlevel修改
- windows 系统更新 WSUS的安装与部属
- ImportError: cannot import name main
- Stanford机器学习---第六讲. 怎样选择机器学习方法、系统
- Vivado 2017封装自定义IP Core
- 浏览器重定向(302)次数限制问题
- JavaScript正则表达式 1
- 基于R实现统计中的检验方法---方差分析
- 应用服务Application Services
- Win10任务栏图标一直刷新的解决方法
- 你执手嫣然入了画幕,我漠然割舍断了归途
- 让自己的博客可以在百度上搜索到
- GO笔记之为什么要学习GO
热门文章
- UITextView详解
- 让用户研究插上数据的翅膀
- mysqlbinlog工具_MySQL binlog相关分析
- 编辑器未包含main类型_利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中...
- Hive文件数创建过多的问题
- (123)FPGA面试题-介绍低速接口(UART、IIC、SPI),SPI有几根线,每根线的作用?(三)
- (82)Verilog HDL:状态机二段式
- 服务器多路径 映射分区找不到,设备映射多路径DM-Multipath
- STM32中断与事件
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型