主要内容
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;
}
以上的两种写法都可以。
习题
课后练习