数据类型之间的隐式转换

use*_*234 6 c++ type-conversion

例如,为什么一个unsigned short和之间的操作结果int总是产生一个int

unsigned short s = 65535;
int i = 65535
Run Code Online (Sandbox Code Playgroud)

表达式typeid(s * i * i).name(),给出一个超出范围int但仍隐式转换的值返回int,为什么?

Jam*_*lis 12

在评估大多数算术运算符之前,有一组称为常用算术转换的转换.

基本上,你可以考虑对整数算术有一些规则:

  • 首先,整数运算不会与操作数"小于"进行int,所以在该情况下short * signed char,无论是shortsigned char操作数都提升到int,这两个int值相乘,然后将结果是一个int.

  • 其次,如果一个或两个类型"大于" int,则编译器选择与最大操作数的类型至少"一样大"的类型.所以,如果你有long * int,int则提升为a long,结果是a long.

  • 第三,如果任一操作数是unsigned,则结果是无符号的.所以,如果你有long * unsigned int,那么longunsigned int它们都被提升为一个unsigned long,结果是一个unsigned long.

如果任一操作数具有浮点类型,则执行浮点运算: float,doublelong double使用(哪一个取决于操作数的类型;用于确定结果类型的完整表可以在开头链接的页面上找到这个答案).

请注意,结果类型不依赖于操作数的值.在知道值之前,编译器必须在编译时选择类型.

如果结果s * i * i超出了结果类型的范围(int在您的场景中),那么您运气不好:您的程序无法在运行时决定,"哦,我应该切换到使用long!" 因为必须在编译时选择结果类型.