-2比2小吗? C++ 中 unsigned int 和 int的比较
2012-09-27 15:31
176 查看
一,问题的来源
在使用stl的时候,经常要遍历容器。遍历容器有几种方法,一种就是使用下标遍历。
在使用下标遍历的时候,经常要用到一个遍历的循环变量,往往这个变量一顺手就写成了:
这个i在一般的情况下是没有问题的,然后最近突发奇想,想像python那样,能够支持负的下标。
比如v是一个vector,v[-2]表示后两个元素。
二,问题的描述
假设有这么一段简单的程序:
-2跟2比较输出的是 false,也就是-2要大于2.
这个是怎么一回事呢。
三,问题的原因
其实上一段程序编译的时候会有一个常见的编译器warning:
“warning C4018: “<”: 有符号/无符号不匹配”,通常warning我们也不太在意,但是指不定
什么时候,就耗掉你几个小时。
这个waring就是说,在比较的时候,两边的符号不一致。
在式子:numIndex<numbers.size() 中
numIndex是有符号的,numbers.size()是无符号的。在有符号整数和无符号整数比较的时候,
有符号的整数会向无符号整数转换,这个就是原因。
四,问题的思考
那有符号的numIndex转换成无符号的的整数到底是多少呢?
其结果是
-2:4294967294
也就是说-2转换成了4294967294,这个数当然比2要大。
那为什么是这个数呢?
因为C++中,int的大小是4个字节,也就是32位。2^32-2也就是这个数。
在使用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<numbers.size()){//-2跟2比较
7: cout<<"true"<<endl;
8: }else{
9: cout<<"false"<<endl;
10: }
-2跟2比较输出的是 false,也就是-2要大于2.
这个是怎么一回事呢。
三,问题的原因
其实上一段程序编译的时候会有一个常见的编译器warning:
“warning C4018: “<”: 有符号/无符号不匹配”,通常warning我们也不太在意,但是指不定
什么时候,就耗掉你几个小时。
这个waring就是说,在比较的时候,两边的符号不一致。
在式子:numIndex<numbers.size() 中
numIndex是有符号的,numbers.size()是无符号的。在有符号整数和无符号整数比较的时候,
有符号的整数会向无符号整数转换,这个就是原因。
四,问题的思考
那有符号的numIndex转换成无符号的的整数到底是多少呢?
1: unsigned int unumIndex = numIndex;//转换
2: cout<<"unsigned value of -2:"<<unumIndex<<endl;
其结果是
-2:4294967294
也就是说-2转换成了4294967294,这个数当然比2要大。
那为什么是这个数呢?
因为C++中,int的大小是4个字节,也就是32位。2^32-2也就是这个数。
相关文章推荐
- -2比2小吗? C++ 中 unsigned int 和 int的比较
- -2比2小吗? C++ 中 unsigned int 和 int的比较
- c++ 中关于int,unsigned int , short的关系与应用
- c++ int,unsigned int混合表达式类型转换
- C++中有符号类型(int)和无符号类型(unsigned int)混合算术运算的类型转换会出现的问题
- int与unsigned int之间的运算与比较
- 避免将unsigned int和int放在布尔表达式中作比较
- unsigned int与int相加的问题-----C/C++小知识 区别
- c++中vector<int>和vector<int*>的用法比较
- C++中有符号类型(int)和无符号类型(unsigned int)混合算术运算的类型转换会出现的问题
- c++ 中关于int,unsigned int , short的关系与应用
- c++ 中关于int,unsigned int , short的关系与应用
- int 与 unsigned int (uint) 比较时出现的问题
- c++中的int和unsigned int
- C/C++/JAVA中short,int,long等整型表示范围的比较
- C++中值传递、指针传递和引用传递的比较
- LUA与C++的语法比较
- navicat设置mysql中的int字段以及c++中int类型小细节
- Java中Integer与int类型的比较--装箱和拆箱
- 多态在 Java 和 C++ 编程语言中的实现比较