有符号数与无符号数的程序设计原则:
当需要表示数值时,使用有符号数(如 int)。
当需要表示位集合时,使用无符号数(如unsigned int)。
有符号数和无符号数混合运算有可能会带来灾难性的后果。例如:
vector v;
for(int i=0;i
易实现版本:
unsigned char max=160; //非常大
for(signed char i=0;i
循环变量i可能会溢出,即,v.size()有可能比最大的有符号数int值还要大。当i的值增大到有符号数int所能代表的最大正数(如,int为16位宽度,此值为215-1)时,下一次增1运算不会得到更大的整型值,而会得到一个负数。因此循环永远也不会停止!每当我们到达最大整数时,接着就会从最小负int值重新开始。因此如果v.size()的值为32*1024或者更大,循环变量为16位int型的话,这个循环就是一个(可能非常严重的)bug。如果循环变量是32位int型的话,当v.size()的值大于等于2*1024*1024*1024时就会出现同样的问题。
为了避免这个问题,我们可以使用vector提供的size_tupe或者是迭代器:
for(vector::size_type i=0;i
for(vector::iterator p=v.begin();p!=v.end();++p)cout<
for(int x:v)cout<
size_tupe确保是无符号的,因此,第一种形式(使用无符号数)与int型循环变量的版本相比,多出一个二进制位来表示循环变量的数值(而不是符号)。这个改进很重要,但终究只是多出一位来表示循环的范围(循环次数多出一倍)。而使用迭代器的版本就不存在这个限制。
大致来说,我们有两个原因将无符号数当作整数来使用,而不是简单作为一组二进制位(即,不使用+、-、*和/);
有更多的二进制位来表示数值,从而获得更高的精度。
用来表示逻辑属性,其值不能是负数。
前者就是我们刚刚看到的,使用无符号循环变量带来的效果。
混合使用有符号数和无符号数的问题在于,在c++中,两者转换的方式很奇怪,而且难以记忆。例如:
unsigned int ui=-1;
int si=ui;
int si2=ui+2;
unsigned ui2=ui+2;
输出结果:
4294967295
-1
1
1
不推荐为获得一个额外的二进制位的精度而是要无符号数。
标准库容器的下标都是无符号数。
c++程序设计原理与实践(进阶篇)
C语言基础(5)-有符号数、无符号数、printf、大小端对齐
1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 10 ...
深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...
C语言中 有符号数、无符号数、整数溢出 (转)
#include void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } ...
java 理解有符号数和无符号数
转至:http://jinguo.iteye.com/blog/212049 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用“ ...
c++ 常量/有符号数和无符号数
一.宏定义 #define 和常量 const 1. const关键字 const是constant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改.也就是说c ...
Mysql中有符号数和无符号数的区别