-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也就是这个数。

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

int 与 unsigned int (uint) 比较时出现的问题

今天遇到一个问题 ,简单描述如下     int   index = -1;     NSMutableArray *arr = [NSMutableArray array];     [...
  • typingios
  • typingios
  • 2012年07月24日 18:24
  • 4992

C++ unsigned char/int 转二进制方法

C++中输出十进制、八进制、十六进制都有其对应的命令,那二进制有没有呢? cout...
  • cuizhiyi2008
  • cuizhiyi2008
  • 2014年06月18日 09:06
  • 844

c++中的int和unsigned int

代码: void main(int argc, char** argv, char** env) { unsigned int  a = 10; int b = -1; cout co...
  • u012861978
  • u012861978
  • 2015年06月23日 15:00
  • 1126

signed 与 unsigned 比较大小的默认转换

学习c语言的朋友们也许都学到了int型与unsigned int型比较大小的方法。比如以下程序: #include int main() {     int a = -1;    ...
  • Super_Big_Fish
  • Super_Big_Fish
  • 2016年08月02日 19:02
  • 985

关于int和unsigned int的一些运算

今天去了一家游戏公司笔试,其中有一题引起我的
  • vincent_ling
  • vincent_ling
  • 2014年11月12日 00:51
  • 507

解决 format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘int *’

[root@CC c]# gcc MemTest.c -o MemTest1 -Wall MemTest.c: In function ‘main’: MemTest.c:24: warning:...
  • Richmond2012
  • Richmond2012
  • 2014年11月05日 23:04
  • 1797

java中,从空间的角度比较 new int[2][100] 与 new int[100][2]

分析下new int[2][100]的内存大小: 一维: 8字节       对象头部 4字节       数组长度描述 4*2           一维的引用宽度 4               p...
  • f1024042400
  • f1024042400
  • 2016年08月08日 12:06
  • 190

unsigned 类型减法注意点

新年第一天,执行新年计划,每日一记,大小皆宜。      今天碰到一个小问题,不引人注目,却也会是个大坑,留下警示自己吧。     代码中有两个unsigned int相减的公式:      u...
  • zhyajshhz
  • zhyajshhz
  • 2015年02月25日 17:23
  • 432

int与unsigned等转换深入理解(二)

1、隐式转换     C在以下四种情况下会进行隐式转换:        1、算术运算式中,低类型能够转换为高类型。        2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并...
  • qq_24373811
  • qq_24373811
  • 2016年10月25日 14:50
  • 2543

unsigned int数相减时候的trick

假设是8位的unsigned int整数。 一个是x=134,一个是y=246.首先拿过来就是计算它们的二进制位: 134 = 1000,0110B 246 = 1111,0110B因为是无符号...
  • u011240016
  • u011240016
  • 2016年09月18日 01:34
  • 852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:-2比2小吗? C++ 中 unsigned int 和 int的比较
举报原因:
原因补充:

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