-2比2小吗? C++ 中 unsigned int 和 int的比较

转载 2015年07月07日 21:34:38

一,问题的来源

在使用stl的时候,经常要遍历容器。遍历容器有几种方法,一种就是使用下标遍历。

在使用下标遍历的时候,经常要用到一个遍历的循环变量,往往这个变量一顺手就写成了:

1: int i = 0;

这个i在一般的情况下是没有问题的,然后最近突发奇想,想像python那样,能够支持负的下标。

比如v是一个vector,v[-2]表示后两个元素。

 

二,问题的描述

假设有这么一段简单的程序:

1: vector<int> numbers;//声明一个vector; 2: numbers.push_back(1); 3: numbers.push_back(2);//压入两个数,让他的size不为0 4:  5: int numIndex =-2;//声明一个有符号的整数 6: if(numIndex&lt;numbers.size()){//-2跟2比较 7: cout&lt;&lt;"true"&lt;&lt;endl; 8: }else9: cout&lt;&lt;"false"&lt;&lt;endl; 10: }

-2跟2比较输出的是 false,也就是-2要大于2.

这个是怎么一回事呢。

 

三,问题的原因

其实上一段程序编译的时候会有一个常见的编译器warning:

“warning C4018: “&lt;”: 有符号/无符号不匹配”,通常warning我们也不太在意,但是指不定

什么时候,就耗掉你几个小时。

这个waring就是说,在比较的时候,两边的符号不一致。

在式子:numIndex&lt;numbers.size() 中

numIndex是有符号的,numbers.size()是无符号的。在有符号整数和无符号整数比较的时候,

有符号的整数会向无符号整数转换,这个就是原因。

 

四,问题的思考

那有符号的numIndex转换成无符号的的整数到底是多少呢?

1: unsigned int unumIndex = numIndex;//转换 2: cout&lt;&lt;"unsigned value of -2:"&lt;&lt;unumIndex&lt;&lt;endl;

其结果是

-2:4294967294

也就是说-2转换成了4294967294,这个数当然比2要大。

那为什么是这个数呢?

因为C++中,int的大小是4个字节,也就是32位。2^32-2也就是这个数。

更多系列文章敬请访问:我的个人博客 第九兔

相关文章推荐

c++ unsigned和int类型转换及运算

一、规则总结 1. 在c++中,如果赋值给无符号类型一个超过它表示范围的值(如负数),结果是初始值对无符号类型表示数值最大值取模后的余数。 2. 在c++中,如果表达式中同时有无符号类型和有符号类型,...

C++模版使用技巧--Int2Type

一 Int2Type 平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。 二 C++模版的迟绑定 这个名字是我起的,...

modern c++ design Int2Type的意义

template int v> struct Int2Type {     enum { value = v }; }; 如下: template typename T, bo...
  • gxut555
  • gxut555
  • 2012年04月06日 17:57
  • 495

modern c++ design Int2Type 笔记

#include using namespace std; class Normal { int _i; public: Normal() { _i = 0; } Norm...
  • gxut555
  • gxut555
  • 2012年04月07日 10:52
  • 366

opencl:C++11下使用别名(x,y,z,hi,lo...)访问vector类型(cl_int2,cl_long16...)的元素

在gcc(5.2.0)下使用C++11写opencl的程序时,发现无法像内核代码一样对cl_int2这样的向量(vector)类型用pos.x,pos.y这样的方式来访问向量元素,只能用pos.s[0...
  • 10km
  • 10km
  • 2016年04月10日 10:57
  • 3021

volatile_unsigned_int

  • 2013年03月22日 23:27
  • 197KB
  • 下载

把unsigned int 对调

  • 2011年12月06日 19:48
  • 422B
  • 下载

Modern C++ Design学习笔记:Int2Type, Type2Type, TypeSelect

原来C++ 0x已经成为国际标准了。经过多年的努力,这个28岁的家伙又上升了一个层次。而28岁的我呢...     //重新学习C++     最近静下心来,阅读Modern C++ Desi...

(*(volatile_unsigned_int_ *))

  • 2010年10月29日 21:20
  • 88KB
  • 下载

DCU2INT_GUI

  • 2008年11月30日 11:40
  • 479KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:-2比2小吗? C++ 中 unsigned int 和 int的比较
举报原因:
原因补充:

(最多只允许输入30个字)