跳转到内容

编程基础/数据类型转换

来自维基教科书,开放的书籍,开放的世界

更改值的數據類型被稱為“类型转换”。有两种方法可以做到这一点

  1. 隐式 - 更改是隐含的
  2. 显式 - 更改是通过运算符或函数显式执行的

要更改的值可能是

  1. 提升 - 从较小的域到较大的域
  2. 降级 - 从较大的域到较小的域

隐式类型转换

[编辑 | 编辑源代码]

编程语言在没有程序员明确指示的情况下,自动将值从一种数据类型转换为另一种数据类型,称为隐式类型转换。它发生在二元运算符具有两种不同数据类型的操作数时。根据运算符,其中一个操作数将被转换为另一个操作数的数据类型。它可以根据运算符进行提升或降级。

隐式提升

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 的整数值。这种进展允许我们从字符提升到整数,再到 float,最后到 double。

降级代表一个潜在问题,可能会发生截断或不可预测的结果。你如何将 456 的整数值放入字符值中?你如何将 45656.453 的浮点值放入整数值中?大多数编译器如果检测到降级正在发生,会发出警告。编译器警告不会停止编译过程。它确实警告程序员检查降级是否合理。

如果我根据要服务的人数(比如 8 人)和每罐的份数(比如 2.3 人)来计算要购买的汤罐数量,我需要 18.4 罐。我可能想要将 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")

关键词

[编辑 | 编辑源代码]
降级
从较大的域到较小的域。
显式
使用强制转换运算符更改值的类型。
隐式
自动更改数据类型的值。
提升
从较小的域到较大的域。
截断
浮点数据类型在转换为整数时被丢弃的小数部分。

参考资料

[编辑 | 编辑源代码]
华夏公益教科书