有符号数与无符号数的程序设计原则:

  • 当需要表示数值时,使用有符号数(如 int)。
  • 当需要表示位集合时,使用无符号数(如unsigned int)。

有符号数和无符号数混合运算有可能会带来灾难性的后果。例如:

vector<int> v;
for(int i=0;i<v.size();++i)cout<<v[i]<<'\n';

易实现版本:

unsigned char max=160;    //非常大
for(signed char i=0;i<max;i++)cout<<int(i)<<'\n';

循环变量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<int>::size_type i=0;i<v.size();++i)cout<<v[i]<<'\n';
for(vector<int>::iterator p=v.begin();p!=v.end();++p)cout<<*p<<'\n';
for(int x:v)cout<<x<<'\n';

  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++程序设计原理与实践(进阶篇)的更多相关文章

  1. C语言基础(5)-有符号数、无符号数、printf、大小端对齐

    1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 10 ...

  2. 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

    上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...

  3. C语言中 有符号数、无符号数、整数溢出 (转)

    #include<stdio.h> void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } ...

  4. java 理解有符号数和无符号数

    转至:http://jinguo.iteye.com/blog/212049 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用“ ...

  5. c++ 常量/有符号数和无符号数

    一.宏定义 #define 和常量 const 1. const关键字 const是constant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改.也就是说c ...

  6. 关于有符号数和无符号数的转换 - C/C++

    转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题, ...

  7. Mysql中有符号数和无符号数的区别

    1原文地址:https://blog.csdn.net/s78365126/article/details/85048882 2可以手写sql验证一下 3mysql无符号和有符号的区别无符号unsig ...

  8. Qt之C语言有符号数与无符号数运算

    以32位的stm32f4为例: 1.  uint32_t t_int_k = 239773, t_int_km1 = 4294859707; 则t_int_k - t_int_km1 > 0; ...

  9. C语言迷题:有符号数与无符号数的问题(转)

    https://my.oschina.net/kelvinfang/blog/134725

随机推荐

  1. 1112 Stucked Keyboard

    题意:坏掉的键若被按下,总是重复打出k次.比如,k为3,打出的序列如下—— thiiis iiisss a teeeeeest 坏掉的键是i和e,虽然iiisss中s也出现了3次,但它不是坏掉的键,因 ...

  2. angular 三大核心函数

    1.$watch  angular监听   由于angular一直在实时监听,所以比react和vue效率要低 $scope.$watch('aModel', function(newValue, o ...

  3. FusionCharts simple demo for (html+js、APS.NET Webform、MVC)

    做GIS或其他内部数据统计项目的应该对FusionCharts也不会太陌生,简单易用已无需多说什么了,只是有时候框架不同,实现起来也稍有差异 引用dll调用FusionCharts类的静态方法Rend ...

  4. Django Rest Framework 4

    目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...

  5. Sql Server 2005如何导入DBF文件?

    提问者采纳   select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DA ...

  6. delphi 原生 ADODB.recordset

    ADODB.recordset ..\source\rtl\win\Winapi.ADOInt.pas..\17.0\OCX\Servers\ADODB2010.pasCLASS_Recordset: ...

  7. IE6的checkbox, radio是通过defaultChecked决定是否选中

    今天五群提到的BUG,说checked没有生效,一番百度谷歌,发现是它作怪. data.handler = function() { //IE6是通过defaultChecked来实现打勾效果 ele ...

  8. 性能调试工具——oprofile

    oprofile利用cpu硬件层面提供的性能计数器(performance counter),通过计数采样,帮助我们从进程.函数.代码层面找出占用cpu的"罪魁祸首". 常用命令 ...

  9. leetcode:First Missing Positive分析和实现

    题目大意: 传入整数数组nums,求nums中未出现的正整数中的最小值.要求算法在O(n)时间复杂度内实现,并且只能分配常量空间. 分析: 一般碰到这种问题,都先对数组进行排序,再遍历数组就可以找到最 ...

  10. codeforce 461DIV2 E题

    题意 有n棵树排成一排,每个树上都有c[i]只小鸟,只有站在树下才可以召唤小鸟,在i-th树下召唤k(k<=c[i])只小鸟需要消耗cost[i]*k的法力值,但是每召唤一只小鸟可以将法力值的上 ...