编程基础
概述
更改值的数据类型称为“类型转换”。有两种方式可以进行类型转换:
- 隐式转换 – 自动发生的类型转换
- 显式转换 – 通过运算符或函数显式地进行类型转换
被转换的值可以是:
- 提升 – 从较小的域转换到较大的域
- 降级 – 从较大的域转换到较小的域
讨论
隐式类型转换
隐式类型转换指的是编程语言在没有程序员明确操作的情况下自动将值从一种数据类型转换为另一种数据类型。当二元运算符的两个操作数数据类型不同时,通常会发生隐式类型转换。根据运算符的不同,其中一个操作数会被转换为另一个操作数的数据类型。这可能是提升或降级,取决于运算符。
- 隐式提升
55 + 1.75
在这个例子中,整数值 55 会被转换为浮点值(最可能是 double 类型)55.0,这就是“提升”。
- 隐式降级
在具有显式整数数据类型的编程语言(如 C++、C#、Java)中,需要小心避免隐式降级。例如:
int money;
money = 23.16;
在这个例子中,变量 money
是一个整数。我们尝试将一个浮点值 23.16 存入一个整数存储位置。这是降级,浮点值通常会被截断为 23。
提升
提升从来不是一个问题,因为较低的数据类型(较小的值域)是较高数据类型(较大值域)的子集。提升通常发生在三种标准数据类型之间:字符、整数和浮点型。它们的允许值(或域)是从一个类型到另一个类型的过渡。即,字符数据类型的值是整数值的子集,而整数值是浮点值的子集;而在浮点值中,float 是 double 的子集。即使字符数据代表字母、数字(0 到 9)和其他符号(如句号、美元符号、逗号等),它们的比特模式也表示从 0 到 255 的整数值。这种过渡使得我们可以将它们从字符类型提升到整数、浮点和 double 类型。
降级
降级可能会导致截断或不可预测的结果。如何将一个整数值 456 转换为字符值?如何将浮点值 45656.453 转换为整数?如果检测到降级,许多编译器会发出警告。编译器警告不会阻止编译过程,但它会警告程序员检查降级是否合理。
例如,如果我根据我要服务的人数(例如 8)和每罐的份数(例如 2.3)计算需要购买多少罐汤,我会需要 18.4 罐。我可能会希望将 18.4 转换为整数,这样它会被截断为 18。由于值 18 在整数数据类型的域内,这样的降级是合理的。
如果我尝试将一个包含银河系恒星数量的 double 类型值降级为整数,可能会得到不可预测的结果(假设恒星的数量超过了整数类型的允许范围)。
显式类型转换
大多数编程语言都提供了一种方法,让程序员将一个值从一种数据类型转换为另一种数据类型,这叫做显式类型转换。有些语言支持转换运算符。转换运算符是一个一元运算符,它只有一个操作数,并且该操作数位于运算符的右侧。该运算符是一个用括号包围的新数据类型。其他语言通过函数实现显式类型转换。在以下示例中,表达式的值将是 3。
语言 | 浮点到整数类型转换示例 |
---|---|
C++ | (int) 3.14 |
C# | Convert.ToInt32(3.14) |
Java | Math.floor(3.14) |
JavaScript | Math.floor(3.14) |
Python | int(3.14) |
Swift | Int(3.14) |
在以下示例中,表达式的值将是 3.14。
语言 | 字符串到浮点类型转换示例 |
---|---|
C++ | #include <string.h> std::stod("3.14") |
C# | Convert.ToDouble("3.14") |
Java | Double.parseDouble("3.14") |
JavaScript | parseFloat("3.14") |
Python | float("3.14") |
Swift | Double("3.14") |
关键术语
- 降级:从较大的域转换到较小的域。
- 显式:通过转换运算符显式改变值的数据类型。
- 隐式:值的数据类型被自动改变。
- 提升:从较小的域转换到较大的域。
- 截断:当浮点数据类型转换为整数时丢弃的小数部分。
参考文献
- cnx.org: 《编程基础 - 使用 C++ 的模块化结构化方法》