主要内容 #
1. 问题 #
从上一节课的学习中,我们知道了“隐式类型转化”。
short 和 int 共同参与的表达式,计算结果是一个 int 。
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 |
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; }
以上的两种写法都可以。