当前位置 博文首页 > CW_qian的博客:7月16日笔记C语言基础类型转换

    CW_qian的博客:7月16日笔记C语言基础类型转换

    作者:[db:作者] 时间:2021-08-25 21:48

    类型转换

    • 概念:不一致但相互兼容的数据类型,在同一表达式中将会发生类型转换。
    • 转换模式:
      • 隐式转换:系统按照隐式规则自动进行的转换
      • 强制转换:用户显式自定义进行的转换
    • 隐式规则:从小类型向大类型转换,目的是保证不丢失表达式中数据的精度
    • char->short->int->long->float->double->long double

    隐式转换示例代码

    char??a = 'a';

    int???b = 12;

    float?c = 3.14;

    float?x = a + b - c; // 在该表达式中将发生隐式转换,所有操作数被提升为float

    • 强制转换:用户强行将某类型的数据转换为另一种类型,此过程可能丢失精度

    char??a = 'a';

    int???b = 12;

    float?c = 3.14;

    float?x = a + b - (int)c; // 在该表达式中a隐式自动转换为int,c被强制转为int

    不管是隐式转换,还是强制转换,变换的都是操作数在运算过程中的类型,是临时的,操作数本身的类型不会改变,也无法改变。

    数据类型的本质

    • 概念:各种不同的数据类型,本质上是用户与系统对某一块内存数据的解释方式的约定。
    • 推论:
      • 类型转换,实际上是对先前定义时候的约定,做了一个临时的打破。
      • 理论上,可以对任意的数据做任意的类型转换,但转换之后的数据解释不一定有意义。

    整型数据尺寸

    • 概念:整型数据尺寸是指某种整型数据所占用内存空间的大小
    • C语言标准并未规定整型数据的具体大小,只规定了相互之间的 “ 相对大小 ” ,比如:
      • short 不可比 int 长
      • long 不可比 int 短
      • long 型数据长度等于系统字长
    • 系统字长:CPU 一次处理的数据长度,称为字长。比如32位系统、64位系统。
    • 典型尺寸:
      • char 占用1个字节
      • short 占用2个字节
      • int 在16位系统中占用2个字节,在32位和64位系统中一般都占用4个字节
      • long 的尺寸等于系统字长
      • long long 在32位系统中一般占用4个字节,在64位系统中一般占用8个字节
    • 存在问题:
      • 同样的代码,放在不同的系统中,可能会由于数据尺寸发生变化而无法正常运行。
      • 因此,系统标准整型数据类型,是不可移植的,这个问题在底层代码中尤为突出。

    可移植性整型

    • 概念:不管放到什么系统,尺寸保持不变的整型数据,称为可移植性整型
    • 关键:typedef

    typedef?int?int32_t; ?// 将类型 int 取个别名,称为 int32_t

    typedef?long?int64_t; // 将类型 long 取个别名,称为 int64_t

    • 思路:
      1. 为所有的系统提供一组固定的、能反应数据尺寸的、统一的可移植性整型名称
      2. 在不同的系统中,为这些可移植性整型提供对应的 typedef 语句
    • 系统预定义的可移植性整型:

    int8_t

    int16_t

    int32_t

    int64_t

    uint8_t

    uint16_t

    uint32_t

    uint64_t

    pid_t

    time_t

    size_t

    ... ...

    cs