有符号数和无符号数------c++程序设计原理与实践(进阶篇)
有符号数与无符号数的程序设计原则:
- 当需要表示数值时,使用有符号数(如 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++程序设计原理与实践(进阶篇)的更多相关文章
- C语言基础(5)-有符号数、无符号数、printf、大小端对齐
1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 10 ...
- 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...
- C语言中 有符号数、无符号数、整数溢出 (转)
#include<stdio.h> 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 ...
- 关于有符号数和无符号数的转换 - C/C++
转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题, ...
- Mysql中有符号数和无符号数的区别
1原文地址:https://blog.csdn.net/s78365126/article/details/85048882 2可以手写sql验证一下 3mysql无符号和有符号的区别无符号unsig ...
- Qt之C语言有符号数与无符号数运算
以32位的stm32f4为例: 1. uint32_t t_int_k = 239773, t_int_km1 = 4294859707; 则t_int_k - t_int_km1 > 0; ...
- C语言迷题:有符号数与无符号数的问题(转)
https://my.oschina.net/kelvinfang/blog/134725
随机推荐
- 1139 First Contact
题意:给出n个人,m对朋友关系,其中带负号的表示女孩.然后给出k对查询a,b,要求找出所有a的同性别好友c,以及b的同性别好友d,且c和d又是好友关系.输出所有满足条件的c和d,按c的升序输出,若c编 ...
- C#简单操作XML
类文件: class OperatorXML { /// <summary> /// 确定资源文件路径,Resource为自己创建的目录 /// </summary> priv ...
- python学习(十二) 图形化用户界面
12.1 丰富的平台 12.2 下载和安装wxPython 12.3 创建示例GUI应用程序 12.3.1 开始 12.3.2 窗口和组件 12.3.3 标签.标题和位置 12.3.4 更智能的布局 ...
- c#编写的基于TCP通信的微风IM 版本3 新年新UI
电商商模 背景:来源,产生运营模式:模式特点,服务对象,业务开展,赢利点,扩 张点,定价策略行业分析:市场分析:DX,企业,政策,经济,文化,技术 网站架构:频道,版块,功能体系 项目推广:地面推广, ...
- Py修行路 python基础 (二十一)logging日志模块 json序列化 正则表达式(re)
一.日志模块 两种配置方式:1.config函数 2.logger #1.config函数 不能输出到屏幕 #2.logger对象 (获取别人的信息,需要两个数据流:文件流和屏幕流需要将数据从两个数据 ...
- pandas分组和聚合
Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:s ...
- Python基础学习四 列表、元组、字典、集合
列表list,用中括号“[ ]”表示 1.任意对象的有序集合 列表是一组任意类型的值,按照一定顺序组合而成的 2.通过偏移读取 组成列表的值叫做元素(Elements).每一个元素被标识一个索引,第一 ...
- 分布式系统CAP定理
分布式系统领域有个著名的CAP定理: C-数据一致性: A-服务可用性: P-服务对网络分区故障的容错性 这三个特性在任何分布式系统中不能同时满足,最多同时满足两个 ZooKeeper是个CP的,即任 ...
- tomcat报503 或者无法启动应用
一般都是配置文件有问题,或者路径问题,或者jvm的参数路径问题.... 总之,报错实在是不清楚!这点比resin差远了!!
- 23-单词数(HDU2070)
单词数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...