C++旧版课程库
C++第 1 期查看课程总览

032 数据类型转化2

主要内容

1. 问题

从上一节课的学习中,我们知道了“隐式类型转化”。 short 和 int 共同参与的表达式,计算结果是一个 int 。
  • 2 Bytes: short, unsigned short
  • 4 Bytes: int, unsigned int, long, unsigned long, float
  • 2. 显式(强制)类型转化

    什么是“ 显式类型转化”?其实就是上述过程的“逆过程”。 但是,逆过程可能会带来额外的问题。

    2.1 十六进制的好处

    我们首先定义两个变量,随意赋值。
    
    unsigned short dashi_s;
    unsigned int   dashi_i;
    
    dashi_s = 0xF0F0;     // 十六进制的 1 位,对应二进制的 4 位。
    dashi_i = 0xF0F0A010  // 在分析问题是,能带来很多方便。
    
    这里稍微提一下,十六进制表示的重要性。
    
        1111 0000 1111 0000 (2进制)
    0x  F    0    F    0;     
    
    从二进制中,可以直接看出来,内存中的“有电没电”状态。
    而十六进制的每 1 位,正好对应二进制的 4 位。
    
    故而,用十六进制表达,既可以较为直观的看出内存状态,也较为简洁。
    

    2.2 数据截断

    这时,假如将 “数据长度较长的 dashi_i” 赋值给 “数据长度较短的 dashi_s” 会发生什么呢?
    
    dashi_i; // 0xF0F0A010
    dashi_s; // 0xF0F0;
    
    dashi_s = dashi_i;
    
    很显然,小容量的空间,存储不了大数据。 所以,本来完整的数据,只能被“拦腰折断”!那么,就会发生问题。 当程序中,需要做这样的转化时,必须要特别注意。 应该遵守这样的原则:
  • 赋值的值 不能超过 被赋值变量类型的表示范围
  • 小数 转化成整数,仅仅保留整数部分(不是四舍五入,而是直接取整数部分)。
  • 2.3 数据类型的表示范围

    常见数据类型的长度(Win32为例) 在不同的操作系统下,数据类型的长度会有差异。这里以 32 bit 的操作系统为例说明:
    2.3.1 整型
    类型名称 short int long long long unsigned short unsigned int unsigned long unsigned long long
    所占字节数 2 Bytes 4 Bytes 4 Bytes 8 Bytes 2 Bytes 4 Bytes 4 Bytes 8 Bytes
    表示范围 -32768~32767 -2147483648~ 2147483647 -2147483648~ 2147483647 -9223372036854775808~ 9223372036854775807 0~65535 0~ 4294967295 0~ 4294967295 0~ 18446744073709551615
    表示范围(十六进制) 0x0000~0xFFFF 0x00000000~ 0xFFFFFFFF 0x00000000~ 0xFFFFFFFF 0x0000000000000000~ 0xFFFFFFFFFFFFFFFF 0x0000~0xFFFF 0x00000000~ 0xFFFFFFFF 0x00000000~ 0xFFFFFFFF 0x0000000000000000~ 0xFFFFFFFFFFFFFFFF
  • 十六进制的两位,占据 1 Byte;
  • 只有 unsigned 类型,十六进制的表示范围,和十进制的表示范围,是一一对应的;
  • 2.3.2 实型
    类型名称 float(中文翻译:单精度) double(中文翻译:双精度) long double bool
    所占字节数 4 Bytes 8 Bytes 16 Bytes * 1(=8 Bits) Byte,见说明
    表示范围 -3.4E+38~3.4E+38 -1.7E+308~1.7E+308 -3.4E4932~3.4E4932 true / false
    表示范围(十六进制) 0x00000000~ 0xFFFFFFFF 0x0000000000000000~ 0xFFFFFFFFFFFFFFFF 0x0~ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    在C++中,bool 其实也是占一个字节(8 位)。这是比较特殊的地方。
    2.3.3 字符型
    * 字符型还未介绍,将在后续章节讲解。
    类型名称 char unsigned char
    所占字节数 1 Byte 1 Byte
    表示范围 -128~127 0~255
    表示范围(十六进制) 0x00~ 0xFF 0x00~ 0xFF

    3. 语法

    请运行下面的代码。
    
    #include < iostream >
    using namespace std;
    int main()
    {
        float dashima(3.14);
    
        // 第一种写法
        int a = (int)dashima;
        cout << "a = " << a << endl;
    
        // 第二种写法
        int a = int(dashima);
        cout << "a = " << a << endl;
    
        return 0;
    }
    
    以上的两种写法都可以。

    习题

    课后练习