C++隐式转换问题分析及解决办法

我们先来看下实例代码:

#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++中发现的隐式转换问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c++类的隐式转换与强制转换重载详解

    在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用: (2)否则,寻找一个函数模板,将其实例化产生一个匹配的重载函数,若找到则调用: (3)否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它. 如果以上步骤均未找到匹配函数,则这个调用是错误的:如果这个调用有多于一个的匹配选译,则调用匹配出现二义性,也是错误的.   类型转换是将一种类型的值映射为另一种类型的值.类型转换实际上包含

  • C++隐式转换问题分析及解决办法

    我们先来看下实例代码: #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" <<

  • 一文详解JS 类型转换方法以及如何避免隐式转换

    目录 前言 类型转换的概念 5 种转换方法 1. 字符串转换为数字 2. 数字转换为字符串 3. 布尔值转换为字符串或数字 4. 对象转换为原始值 5. 空值和未定义值转换为数字或字符串 隐式转换 总结 前言 当我们使用JavaScript编写代码时,类型转换是一个非常重要的概念.JavaScript是一种弱类型语言,这意味着变量可以自动转换为另一种类型,而不需要我们明确地指定.在这篇文章中,我们将探讨JavaScript类型转换的概念.转换方法,并针对隐式转换进行分析. 类型转换的概念 Jav

  • C语言中自动隐式转换与类型强制转换实例分析

    本文通过一个C程序实例对C语言中自动隐式转换与类型强制转换的注意点进行深入分析,详情如下: 先看一个C程序: #include<stdlib.h> #include<stdio.h> #include<conio.h> double proc(int q){ int n; double sum,t;//本例的关键就在这几个变量的类型上 sum = 2.0; while(sum<=q){ t=sum; //sum = sum+(n+1)/n;//自动隐式转换 sum

  • 隐式转换引起的sql慢查询实战记录

    引言 实在很无语呀,遇到一个mysql隐式转换问题,问了周边的dba大拿该问题,他们居然反问我,你连这个也不知道?白白跟他们混了那么长   尼玛,我还真不知道.罪过罪过-. 问题是这样的,一个字段叫task_id, 本身是varchar字符串类型,但是因为老系统时间太长了,我以为是int或者bigint,所以直接在代码写sql跑数据,结果等了好久就是没有反应,感觉要坏事呀.在mysql processlist里看到了该sql语句,直接kill掉. 该字段是有索引的,并且他的sql选择性很高,索引

  • Java基础之隐式转换vs强制转换

    Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用. 在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题. 例如: 1.定义长整型数据时,必须加后缀l或L long l =123456789012345L 2.定义单精度类型时(7-8位有效数字),必须加后缀 f 或 F float f = 12.5F 3. boolean类型不可

  • SQL Server 中的数据类型隐式转换问题

    写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CREATE TABLE TEST ( ID INT, GOOD_TYPE VARCHAR(12), GOOD_WEIGHT NUMERIC(18,2) ) INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT GOOD_TYPE, CASE WHEN ( G

  • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题

    背景 在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢.这个varchar字段有一个复合索引.其中的总条数有58989,甚至不加单引号查出来的数据不是我们想要的数据. 使用的是mysql 5.6版本,innoDB引擎 实际情况如下 下面我们来看一下执行的结果 在上面的描述中我们还得注意就是,你的where条件的字符串不加单引号必须是全数字.不然就会报错 还有可能查出来的数据不是我们想要的数据.如下图 分析 从执行结果来

  • MySQL索引失效之隐式转换的问题

    目录 常见索引失效: 一.常见索引失效场景 1.条件字段函数操作 2.条件字段运算操作 3.隐式类型转换 4.隐式字符编码转换 二.类型转换 1.字符串转整型 2.时间类型转换 常见索引失效: 1. 条件索引字段"不干净":函数操作.运算操作 2. 隐式类型转换:字符串转数值:其他类型转换 3. 隐式字符编码转换:按字符编码数据长度大的方向转换,避免数据截取 一.常见索引失效场景 root@test 10:50 > show create table t_num\G ******

  • implicit关键字做自定义类型隐式转换的方法

    隐式转换可以通过消除不必要的类型转换来提高源代码的可读性.但是,因为隐式转换不需要程序员将一种类型显式强制转换 为另一种类型,所以使用隐式转换时必须格外小心,以免出现意外结果.一般情况下,隐式转换运算符应当从不引发异常并且 从不丢失信息,以便可以在程序员不知晓的情况下安全使用它们. 在C#中,implicit关键字可以用来做自定义类型隐式转换.下面给个例子来说明. 定义一个Point类,表示一个点: 复制代码 代码如下: public class Point   {     public dou

随机推荐