跳至正文
View Categories

1 min read

主要内容 #

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;
    }

    以上的两种写法都可以。

    习题 #

    课后练习