INT_MIN 写成 (-2147483647 - 1) 和 vs中 warning C4018: “>”: 有符号/无符号不匹配的深入剖析。

首先明确下4个字节的INT能表示的数字范围是2147483647—— -2147483648,来看我遇到的问题:

这里输出了“相等”说明

(INT_MIN==-2147483648)

为true。

输出了“ 1<-2147483648”,说明认为

(1<-2147483648)

为true,但是这不科学。

输出了“-1>2147483648”说明

( -1>2147483648)

为true,这也不科学。

INT_MIN和-2147483648相等,上面这些输出到底是怎么回事?来看一下INT_MIN是怎么定义的,在limits.h中

  #define INT_MIN     (-2147483647 - 1)

从这里我们就可以看出一些端倪,为什么不是直接写成-2147483648而是写成 -2147483647 - 1呢?原来C++标准中 -2147483648并不是一个整型的常量。在C++中一个整型常量一开始只是一个数字,没有小数点或者指数,它可能会包含一个表示进制的前缀或一个表示类型的后缀。原文如下:

“An integer constant begins with a digit, but has no period or exponent part.
 It may have a prefix that specifies its base and a suffix that specifies its type.”

这里面没有提到符号,所以-2147483648实际上是一个常量表达式。由一个’-‘号和整型常量2147483648组成的常量表达式。由于我使用vs2012还停留在C89标准,C89按如下顺序匹配整形常量。

C89 :   int, long int, unsigned long int

int, long int在32位机器上都是4个字节,32位的。2147483648超出了32位有符号整数的表示范围所以2147483648被认为是一个unsigned long int,然后再做’-‘操作。在vs 2012编译器中写入下图中的程序,编译时-2147483648这个常量表达式会有如下warning:

warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

说明-2147483648运算过中确实被转换成了无符号数2147483648,而且一元负运算符应用于无符号类型,结果仍为无符号类型。所以只要碰到-2147483648这个常量表达式,结果就是2147483648。

现在我们明白了-2147483648这个运算过程,再来分析第一张图中出现这样的问题的原因。首先来看为什么(INT_MIN==-2147483648)为true,在计算机中数字都是补码表示,

INT_MIN  补码:10000000 00000000 00000000 00000000
2147483648 补码:10000000 00000000 00000000 00000000

这两个数字的补码是相同的,所以他们当然相等。但是他们类型的不同导致了他们值的不同。输出了“ 1<-2147483648”那么就可以理解了这个表达式实际是“ 1<2147483648”当然为true。再来看最后一个输出( -1>2147483648)是怎么回事。来看vs2012在(a>b)中的如下warning,

warning C4018: “>”: 有符号/无符号不匹配

这个警告是因为a是int类型,b是unsigned类型,有符号无符号不匹配的问题,这时候编译器把a变成了无符号类型,再来看两个数的补码

  a 补码:11111111 11111111 11111111 11111111
  b 补码:10000000 00000000 00000000 00000000

所以这里a>b为true。那么输出的”-1>2147483648”也可以解释了。

时间: 2024-10-24 03:49:58

INT_MIN 写成 (-2147483647 - 1) 和 vs中 warning C4018: “>”: 有符号/无符号不匹配的深入剖析。的相关文章

汇编中的有符号-无符号-溢出-进位

什么是有符号数?什么是无符号数?什么是溢出(OF)?什么是进位(CF)?如何区分有无符号 呢?有符号数,就是带符号的数,可以是正数或负数.区分正数或负数时,看这个数的最高位是 否为 1,最高位为 1,说明它是负数.最高为 0 说明它是正数.例如一个字节有符号数,表示范围(-128 ~ 127):A0 :1010 0000 : -96 最高位为 1,说明是负数 80 :1000 0000 :-128 最高位为 1,说明是负数 5B :0101 1011 : 91 最高位位 0,说明它是正数 09

java中无符号类型的处理

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取. Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:(1)int   readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,

java中无符号类型的处理[转]

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取. Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法: (1)int  readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,

Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: 1 2 3 4 5 6 7 8 9 10 11 12 create or replace procedure getidlist is   l_idlist varchar2(200); begin   l_idlist:='1,2,3,4';   for brrs in (select * fro

把ps -ef &amp; kill指令写成可以自动执行的shell脚本

之前重启服务器上的服务,均是先使用ps -ef | grep xxx指令查询出PID,然后再使用kill -9 PID指令杀死进程.由于重启的服务只止一个,每次都要重复输入,甚是麻烦. 示例 今天研究了一下,把以上手动查杀.重启服务的过程写成了shell脚本,重启服务只需执行脚本就可以了.附脚本样例: 1 #!/bin/sh 2 3 # restart das-web 4 ps -ef | grep /home/***/das-web/ | awk '{print $2}' | xargs -n

如何将循环写成递归

转载:http://blog.csdn.net/feixiaoxing/article/details/6838362 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int cal

当写listview的onItemClick的方法时写Toast的参数context写成this出现can&#39;t resolve method ’make text(OnClickListener,java.lang.String,int)&#39;的错误,原因

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); //Toast.makeText(this,fruit.getName(),Toast.L

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

游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式:游戏方式可以发生很大变化,比如棒球模式中,所有刺猬都有保护膜无法损伤,只能击入水中退场 可以制作语音,游戏已经包括如海盗,唱诗风格等五种风格,使用开放的ogg格式 纸娃娃系统,不只可以为每个队员命名,还可以用头饰分辨每个人,已有超过90种头部装饰分辨每个刺猬 支持定制团队背景和离场的动画效果 武器[

cocos2d学习之vc+ 错误 virtual写成vritual的错误提示。

第一张图片的错误原因,在头文件中没有引入类PIAYER 第二张图是vir写成vri了,主要看这类错误的出错信息.