C++中有符号/无符号数比较
原创文章,欢迎阅读,禁止转载。
在我的程序中有如下代码编译被警告了
if(list.size()>msize){...}
warning C4018: '<' : signed/unsigned mismatch
warning C4018: “<”: 有符号/无符号不匹配
这样的比较是不是真可能出问题呢?看个例子
int main()
{
unsigned int a=;
int b = -;
cout<<(a>b)<<endl; //应该是1,实际是0,有bug
cout<<((int)a>b)<<endl; //应该是1,实际也是1,正确
}
如果非要这么比较,那么什么时候结果是正确的呢?
答案是:当a,b的值都在signed/unsigned的重叠范围内,即(UINT_MIN~INT_MAX)之内,称之为安全取值范围。
详细分析一下有符号/无符号数比较的问题,已32位程序为例。
INT_MIN 0x80000000(补码)
UINT_MIN 0x00000000
INT_MAX 0x7FFFFFFF
UINT_MAX 0xFFFFFFFF
解决方法:
消除警告的方法:
强转为int然后比较,但仍有隐患。
防止错误的方法:
1.都使用unsigned 类型。
2.或者评估实际运行中值的范围,仅使用安全范围内(UINT_MIN~INT_MAX)的值。
附:关于计算机中整数表示的知识:
负数在计算机中是用补码表示的
反码=原码各位取反(符号位不动,0正1负)
补码=反码+1
abs(INT_MIN)=abs(INT_MAX)+1
INT_MIN=-(INT_MAX+1)=-INT_MAX-1 //去掉括号防止向上溢出
原创文章,欢迎阅读,禁止转载。
C++中有符号/无符号数比较的更多相关文章
- C语言中无符号数和有符号数之间的运算
C语言中无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. un ...
- 【C语言学习趣事】_33_关于C语言和C++语言中的取余数(求模)的计算_有符号和无符号数的相互转换问题
最近再次复习C++语言,用的教材是<C++ Primer>这本教材, 看到第二章的时候,里面有个问题困扰了我. 于是想上网查查怎么回事, 结果看了很久都没有得到一个满意的答案. 书上有这么 ...
- C语言基础(5)-有符号数、无符号数、printf、大小端对齐
1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 10 ...
- matlab和FPGA中无符号数和有符号数的转化(转)
在FPGA 设计过程中经常会遇到关于数表示之间的转化问题,最常见的是无符号数和有符号数之间的转化问题.(1)在FPGA设计过程中,能够很直接的看出数字的位宽,但经常以无符号数的形式输出,在后继的处理中 ...
- 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...
- C++有符号和无符号数的转换
本文转自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题 ...
- C语言中 有符号数、无符号数、整数溢出 (转)
#include<stdio.h> void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } ...
- 给无符号数赋值负数(有符号数)的理解(unsigned\signedf)
无符号数赋负数(有符号数)就类似于给字符型变量赋数值(char word=0x56),对相同的值不同的类型解析 //s16:signed short; u16:unsigned short s16 t ...
- 有符号数和无符号数------c++程序设计原理与实践(进阶篇)
有符号数与无符号数的程序设计原则: 当需要表示数值时,使用有符号数(如 int). 当需要表示位集合时,使用无符号数(如unsigned int). 有符号数和无符号数混合运算有可能会带来灾难性的后果 ...
随机推荐
- 问题1:Mybatis 中 Signature中的参数args 问题2:MetaObject中 forObject方法中的参数
1.@Intercepts({@Signature(type =StatementHandler.class, method = "prepare", args ={Connect ...
- Spark 读取HBase和SolrCloud数据
Spark1.6.2读取SolrCloud 5.5.1 //httpmime-4.4.1.jar // solr-solrj-5.5.1.jar //spark-solr-2.2.2-20161007 ...
- Git保存密码
TortoiseGit中,通过https方式连接时,默认是不会保存帐号密码,需要我们每次输入一次,真心很麻烦! 通过简单的设置,就可以解决这一问题! 编辑仓库目录中本地的”.git/config”文件 ...
- C# lambda
1. lambda example 1 // Create a basic delegate that squares a number MyDelegate foo = (x) => x * ...
- 对dijkstra算法的自我理解,c#例子
dijkstra该算法主要应用在求解最短路径,从最近点开始,广度搜索. 假设有向图中有10个顶点,求其中某个顶点a到其它顶点的最短路径..满足贪心算法的2个标准.时间复杂度为O(N2) 此问题可以进行 ...
- Pow 算法
#include <iostream> using namespace std; template<class T, class Int> T Pow(T x, Int n) ...
- grep使用多个查询条件--或
[root@mail ~]# grep 'usrquota\|grpquota' /etc/fstabLABEL=/1 / e ...
- scp详解
scp 命令 ================== scp 可以在 2个 linux 主机间复制文件: 命令基本格式: scp [可选参数] file_source file_targe ...
- UiAutomator自动化测试框架介绍
UiAutomator自动化测试框架介绍 环境搭建 1 必要条件 1.1 JDK 1.2 SDK(API高于15) 1.3 Eclipse 2 ...
- python函数动态参数详解
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...