C++数据类型(强制)转换详解
有时,编程的过程中需要将值从一种数据类型转换为另一种数据类型。C++ 提供了这样做的方法。 如果将一个浮点值分配给一个 int 整型变量,该变量会接收什么值?如果一个 int 整数乘以一个 float 浮点数,结果将会是什么数据类型?如果一个 double 浮点数除以一个 unsigned int 无符号整数会怎么样?是否有办法预测在这些情况下会发生什么? 答案是肯定的。当运算符的操作数具有不同的数据类型时,C++ 会自动将它们转换为相同的数据类型。当它这样做时,遵循一组规则。理解这些规则将有助于程序员防止一些细微的错误蔓延到自己的程序中。 就像军队的军官有军阶一样,数据类型也可以按等级排名。如果一个数字数据类型可以容纳的数字大于另一个数据类型,那么它的排名就高于后者。例如,float 类型就超越了 int 类型,而 double 类型又超越了 float 类型。表 1 列出了从高到低排列的数据类型。
表 1 中排名的一个例外是当 int 和 long int 的大小相同时。在这种情况下,unsigned int 将超越 long int,因为它可以保存更高的值。 当 C++ 使用运算符时,它会努力将操作数转换为相同的类型。这种隐式或自动的转换称为类型强制。当一个值被转换为更髙的数据类型时,称之为升级。反之,降级则意味着将其转换为更低的数据类型。 现在来看一看管理数学表达式评估的具体规则:
years * interestRate 在乘法发生之前,years 中的值将升级为 double 类型。
area = length * width; 因为存储在 length 和 width 中的值是相同的数据类型,所以它们都不会被转换为任何其他数据类型。但是,乘法的结果将被升级为 long int 类型,这样才可以存储到 area 中。但是,如果接收值的变量的数据类型低于接收的值,那该怎么办呢?在这种情况下,值将被降级为变量的类型。如果变量的数据类型没有足够的存储空间来保存该值,则该值的一部分将丢失,并且该变量可能会收到不准确的结果。 我们知道,如果接收值的变量想要的是一个整数,而赋给它的值是一个浮点数,那么当转换为 int 并存储在变量中时,浮点值将被截断。这意味着小数点后的所有内容都将被丢弃。示例如下:
int x;
int quantity1 = 6; 类型强制转换有时程序员想要自己更改值的数据类型,这可以通过使用类型强制转换表达式来完成。类型强制转换表达式允许手动升级或降级值。它的一般格式如下:static_cast<DataType>(Value) 其中 Value 是要转换的变量或文字值,DataType 是要转换的目标数据类型。以下是使用类型转换表达式的代码示例:
double number = 3.7; 类型转换表达式在 C++ 不能自动执行所需转换的情况下很有用。 下面的程序显示了使用类型强制转换表达式来防止发生整除法的示例。//This program uses a type cast to avoid an integer division. #include <iostream> using namespace std; int main() { intbooks,months; double booksPerMonth; // Get user inputs cout << "How many books do you plan to read? "; cin >> books; cout << "How many months will it take you to read them? "; cin >> months; // Compute and display books read per month booksPerMonth = static_cast<double>(books) / months; cout << "That is " << booksPerMonth << " books per month.n"; return 0; }程序输出结果:
How many books do you plan to read? 30 booksPerMonth = static cast<double>(books) / months; 变量 books 是一个整数,但是它的值的副本在除法运算之前被转换为 double 类型。如果没有此类型转换表达式,则将执行整除法,导致错误的答案。值得一提的是,如果按以下语句改写此行,则整除法仍然会发生:booksPerMonth = static_cast <double> (books / months); 因为括号内的操作在其他操作之前完成,所以除法运算符将对其两个整数操作数执行整除法,books / month 表达式的结果将是 4,然后将 4 转换为 double 类型的值 4.0,这就是将赋给 booksPerMonth 的值。警告,为了防止发生整除法,在除法运算之前,其中一个操作数应该转换为一个 double 双精度值。这将强制 C++ 自动将其他操作数的值也转换为双精度值。 下面的程序显示了类型强制转换的另一种用法: //This program prints a character from its ASCII code. #include <iostream> using namespace std; int main() { int number = 65; //Display the value of the number variable cout << number << endl; // Use a type cast to display the value of number // converted to the char data type cout << static_cast<char>(number) << endl; return 0; }程序输出结果:
65 注意,C++ 提供了若干种不同类型的强制转换表达式。static_cast 是最常用的类型强制转换表达式,所以这将是在本教程中主要使用的表达式。 C 风格和预标准 C++ 类型强制转换表达式虽然 static_cast 是目前使用最多的类型强制转换表达式,但是 C++ 还支持两种较旧的形式,这也是程序员应该有所了解的,即 C 风格形式和预标准 C++ 形式。C 风格的转换将要转换的数据类型放在括号中,位于值要转换的操作数的前面。因为类型转换运算符在操作数前面,所以这种类型转换表示法被称为前缀表示法,示例如下: booksPerMonth = (double)books / months; 预标准 C++ 形式类型强制转换表达式也是将要转换的数据类型放在其值要转换的操作数之前,但它将括号放在操作数周围,而不是围绕数据类型。这种类型转换表示法被称为功能性表示法,示例如下:booksPerMonth = double(books) / months; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 了解Ruby中的点击
- 大话设计模式三:单一职责原则(拍摄UFO)
- 这种修改过的C#单例模式是一种很好的做法吗?
- flex&java通信错误之一:Server.resource.unavailable
- ruby-on-rails – 多个heroku帐户无法正常工作
- c# – struct的const数组的初始化
- actionscript-3 – 如何通过netConnection和netStream播放R
- oracle sql 去重复记录不用distinct如何实现
- VB6编写的hashtable类
- 【木头Cocos2d-x 016】控件篇(第01章) 我最爱的九妹和按钮事