隐式转换——内置数据类型

概述

隐式转换是指在初始化或赋值或函数调用时编译器隐式完成的不同类型之间的转换

常量转内置类型

对于没有任何常量后缀的整型或者浮点型在进行初始化或赋值或作为函数实参传递时需要进行常量类型匹配

整型

  • int->long int顺序匹配

浮点型

  • 默认都是double类型

用常量初始化或者赋值给内置类型变量时,编译器会判断常量的值是否在内置类型变量取值范围内,如果在内置类型变量取值范围内,编译器会正确初始化或者赋值,否则,编译器会给出警告提示

内置类型之间转换

布尔型转算术类型(整型和浮点型)

  • true->1
  • false->0

算术类型(整型和浮点型)转布尔型

  • 非0->true
  • 0->false
//bool to int
{
    cout << "-------1-------" << endl;

    bool b1 = true;
    bool b2 = false;
    int i1 = b1;
    int i2 = b2;

    cout << i1 << endl;
    cout << i2 << endl;
}

//bool to double
{
    cout << "-------2-------" << endl;

    bool b1 = true;
    bool b2 = false;
    double d1 = b1;
    double d2 = b2;

    cout << d1 << endl;
    cout << d2 << endl;
}

//int to bool
{
    cout << "-------3-------" << endl;

    int i1 = 5;
    int i2 = 0;
    bool b1 = i1;
    bool b2 = i2;

    cout << boolalpha << b1 << endl;
    cout << boolalpha << b2 << endl;
}

//double to bool
{
    cout << "-------4-------" << endl;

    double d1 = 0.1;
    double d2 = 0.0;
    bool b1 = d1;
    bool b2 = d2;

    cout << boolalpha << b1 << endl;
    cout << boolalpha << b2 << endl;
}

整型转整型

字长顺序:char->short->int->long->long long

短字长转长字长

cout << showbase;
cout << hex;

//短字节转长字节
{
    cout << "-------1-------" << endl;

    //signed转unsigned
    signed short ss1 = 0x1234;
    signed short ss2 = -0x1234;
    unsigned int ui1 = ss1;
    unsigned int ui2 = ss2;

    cout << ss1 << " " << ui1 << endl;
    cout << ss2 << " " << ui2 << endl;
}

{
    cout << "-------2-------" << endl;

    //unsigned转signed
    unsigned short us1 = 0x1234;
    unsigned short us2 = -0x1234;
    signed int si1 = us1;
    signed int si2 = us2;

    cout << us1 << " " << si1 << endl;
    cout << us2 << " " << si2 << endl;
}

{
    cout << "-------3-------" << endl;

    //unsigned转unsigned
    unsigned short us1 = 0x1234;
    unsigned short us2 = -0x1234;
    unsigned int ui1 = us1;
    unsigned int ui2 = us2;
    cout << us1 << " " << ui1 << endl;
    cout << us2 << " " << ui2 << endl;
}

{
    cout << "-------4-------" << endl;

    //signed转signed
    signed short ss1 = 0x1234;
    signed short ss2 = -0x1234;
    signed int si1 = ss1;
    signed int si2 = ss2;

    cout << ss1 << " " << si1 << endl;
    cout << ss2 << " " << si2 << endl;
}

结论:

  • 短字长数据进行符号位扩展

同字长互转

cout << showbase;
cout << hex;

//同字长相互转
{
    cout << "-------1-------" << endl;

    //signed转unsigned
    signed int si1 = 0x12345678;
    signed int si2 = -0x12345678;
    unsigned int ui1 = si1;
    unsigned int ui2 = si2;

    cout << si1 << " " << ui1 << endl;
    cout << si2 << " " << ui2 << endl;
}

{
    cout << "-------2-------" << endl;

    //unsigned转signed
    unsigned int ui1 = 0x12345678;
    unsigned int ui2 = -0x12345678;
    signed int si1 = ui1;
    signed int si2 = ui2;

    cout << ui1 << " " << si1 << endl;
    cout << ui2 << " " << si2 << endl;
}

结论:

  • 逐字节复制

长字长转短字长

cout << showbase;
cout << hex;

//长字节转短字节
{
    cout << "-------1-------" << endl;

    //signed转unsigned
    signed int si1 = 0x12345678;
    signed int si2 = -0x12345678;
    unsigned short us1 = si1;
    unsigned short us2 = si2;

    cout << si1 << " " << us1 << endl;
    cout << si2 << " " << us2 << endl;
}

{
    cout << "-------2-------" << endl;

    //unsigned转signed
    unsigned int ui1 = 0x12345678;
    unsigned int ui2 = -0x12345678;
    signed short ss1 = ui1;
    signed short ss2 = ui2;

    cout << ui1 << " " << ss1 << endl;
    cout << ui2 << " " << ss2 << endl;
}

{
    cout << "-------3-------" << endl;

    //unsigned转unsigned
    unsigned int ui1 = 0x12345678;
    unsigned int ui2 = -0x12345678;
    unsigned short us1 = ui1;
    unsigned short us2 = ui2;
    cout << ui1 << " " << us1 << endl;
    cout << ui2 << " " << us2 << endl;
}

{
    cout << "-------4-------" << endl;

    //signed转signed
    signed int si1 = 0x12345678;
    signed int si2 = -0x12345678;
    signed short ss1 = si1;
    signed short ss2 = si2;

    cout << si1 << " " << ss1 << endl;
    cout << si2 << " " << ss2 << endl;
}

结论:

  • 低位字节复制,高位字节截断丢弃

整型转浮点型

安全转换,添加小数部分即可,浮点数取值范围始终大于整型取值范围

浮点型转浮点型

精度顺序:float->double->long double

低精度转高精度,安全

高精度转低精度,不安全,编译器可能产生警告,因为精度和取值范围不同,可能会丢失精度甚至整数部分

cout << setprecision(20);

//低精度转高精度
{
    cout << "-------1-------" << endl;

    float f = 123.456789;
    double d = f;

    cout << f << endl;
    cout << d << endl;
}

//高精度转低精度
{
    cout << "-------2-------" << endl;

    double d = 123.456789456789;
    float f = d;

    cout << d << endl;
    cout << f << endl;
}

浮点型转整型

丢弃小数部分,生成一个临时整型,再按照整型转整型规则将临时整型转换为目标整型,浮点取值范围大于整型,不但丢弃小数部分,甚至可能丢失整数部分,属于不安全转换,编译器可能产生警告

{
    cout << "-------1-------" << endl;

    int i = 567;
    double d = i;

    cout << d << endl;
}

{
    cout << "-------2-------" << endl;

    double d = 456.789;
    int i = d;

    cout << i << endl;
}

指针

指针转布尔类型

  • 非空指针->true
  • 空指针->false
int i = 0;
int *p1 = &i;
int *p2 = NULL;
bool b1 = p1;
bool b2 = p2;

cout << boolalpha << b1 << endl;
cout << boolalpha << b2 << endl;

其他类型指针转void*

class Base
{
};

int i;
double d;
Base base;
void *pv1 = &i;
void *pv2 = &d;
void *pv3 = &base;

整数0转任何类型指针

void *pv = 0;
int *pi = 0;
double *pd = 0;

非const指针转const指针

int i = 5;
const int ci = 8;
int *pi1 = &i;
//int *pi2 = &ci;
const int *pci1 = &i;
const int *pci2 = &ci;

数组类型转数组元素类型指针

int arr1[3];
int *pi1 = arr1;

int arr2[3][4];
//int *pi2 = arr2;
int (*parr)[4] = arr2;
时间: 2024-10-08 23:38:35

隐式转换——内置数据类型的相关文章

Atitit.变量的定义&#160;获取&#160;储存&#160;物理结构&#160;基本类型简化&#160;隐式转换&#160;类型推导&#160;与底层原理&#160;attilaxDSL

Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3. 变量的存储,储存在变量池里Map(varName,varVal)1 1.3.1. 复合变量1 1.4. 变量类型简化: 字符串 数字,  bool1 1.5. 变量自动隐式转换2 1.6. 类型推导2 2. 参考 复合变量2 1.1. $ 美元字符, php 黑头 1.2. 默认变量的范围和声明

scala学习笔记-隐式转换与隐式参数(18)

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转

隐式转换与隐式参数

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转

Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution

在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typeclass在scala中的应用有赖于scala compiler的一项特别功能:隐式转换(implicit conversion),使程序表述更精简.由于隐式转换是一项compiler功能,在程序编译(compile)的时候是由compiler来进行类型转换代码的产生和替代的. 让我们先了解一下作

JavaScript的数据类型的隐式转换

什么是弱类型语言?计算机语言的类型可以分为强类型和弱类型两种. 二者之间的区别,就在于计算时,不同类型数据是否可以透明的隐式转换.如果一个语言可以隐式转换它的所有类型,那么它的变量.表达式等在参与运算时,即使类型不正确,也能通过隐式转换来得到正确的类型,这样的语言就属于弱类型语言. 与此相对,强类型语言的类型之间不一定有隐式转换. 弱类型相对于强类型来说,类型检查更不严格,比如允许变量类型的隐式转换,允许强制类型转换等等,而强类型语言一般不允许这么做.一.1+"2"+"2&q

隐式转换和显式转换

C/C++对于数据类型的转换包括隐式转换和显式转换(强制类型转换). 一般来说,隐式转换包括以下几种情形: 1. 低精度与高精度混合运算,低精度会隐式转换成高精度类型. int a = 10; double b = 1.2; double c = a + b;//此时a会隐式转换成double类型进行运算. bool.char.short.int.long.float.double依次向上会发生隐式转换.bool类型向上转换时,false转换成0,true转换成1. [p.s.]有符号和无符号数

JS隐式转换

 首先,JS数据类型分为6种,分别是null.undefined.boolean.string.number.object.其中,object是引用类型,其余5种是基本类型或者叫做原始类型. 类型转换,就是隐式转换!不同类型的变量相比较时要先转换类型.隐式转换通常发生在运算符加.减.乘.除,以及大于.小于等等. typeof()方法用来打印判断某个元素是什么数据类型. 1.字符串和数字的相互转换: (1).字符串 加 数字 || 数字 加 字符串,数字 => 字符串 eg: typeof("

Scala入门到精通——第十九节 隐式转换与隐式参数(二)

作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自动帮我们搜索相应的隐式值,并将该隐式值作为函数的参数,这里面其实没有涉及到隐式转换,本节将演示如何利用隐式参数进行隐式转换,下面的代码给定的是一个普通的比较函数: object ImplicitP

js学习日记-隐式转换相关的坑及知识

隐式转换比较是js中绕不过去的坎,就算有几年经验的工程师也很有可能对这块知识不够熟悉.就算你知道使用===比较从而避免踩坑,但是团队其它成员不一定知道有这样或那样的坑,有后端语言经验的人常常会形成一个思维误区:"JS这门语言很简单,看看语法再找几个例子就能操作DOM,编写特效了".随着react.vue.html5等技术在项目中大规模使用,越来越多的项目中使用了大量的JS,甚至整个项目都用JS来写(例如基于webapi的SPA管理后台.微信小程序.微信H5应用,Hybrid app),