时间:2021-05-20
我们先来看下实例代码:
#include <iostream>#include <string>using std::cin;using std::cout;using std::endl;using std::string;int main(){ unsigned int a; int b = -1; while (cin >> a) { if (a > b) { cout << "a > b" << endl; } else if (a < b) { cout << "a < b" << endl; } else { cout << "a == b" << endl; } } return 0;}解释:
如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
这个涉及到无符号类型的运算对象:
如果某个运算符的运算对象不一致,这些运算对象将转换成同一种类型。但是如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖机器中各个整数类型中各个整数类型的相对大小了。
像往常一样,首先执行整型提升。如果结果的类型匹配,无需进行进一步的转换。如果两个(提升后的)运算对象的类型要么都是带符号的、要么都是无符号的,则小类型的运算对象转换成较大的类型。
如果一个运算对象是无符号类型、另外一个运算对象是带符号类型,而且其中的无符号类型不小于带符号类型,那么带符号的运算对象转换成无符号的。如上面的程序中的unsigned int和int,则int类型的运算对象转换成unsigned int类型。如果int型的值恰好为负值,则转换为unsigned int的数值总数去模后的余数。也就造成了a < b的奇怪情况。
例如,8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此把-1赋给8比特大小的unsigned char所得的结果是255。
剩下的一种情况是带符号类型大于无符号类型,此时转换的结果依赖于机器,如果无符号类型的所有值都能存在在该带符号类型中,则无符号类型的运算对象转换成带符号类型。如果不能,那么带符号类型的运算对象转换成无符号类型。
到此这篇关于C++隐式转换问题分析及解决办法的文章就介绍到这了,更多相关C++中发现的隐式转换问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。c++规定:
1.隐式类型转换的问题隐式类型转换是C++一个让人又爱又恨的特性,使用方便,但可能会降低代码可读性,甚至会造成一些十分隐晦的错误。#includeusingna
问题:从c++文件中将std:string转换为char*后,返回包含IP地址的char*,需要将该字符串char*中的IP地址提取出来;解决办法:1.解决思路
AndroidHandlerleak分析及解决办法InAndroid,Handlerclassesshouldbestaticorleaksmightoccur
本文实例分析了C#中is与as的区别,分享给大家供大家参考。具体分析如下:一、C#类型的转换在c#中类型的转换分两种:显式和隐式,基本的规则如下:1、基类对象转