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,无论是short和signed char操作数都提升到int,这两个int值相乘,然后将结果是一个int.
其次,如果一个或两个类型"大于" int,则编译器选择与最大操作数的类型至少"一样大"的类型.所以,如果你有long * int,int则提升为a long,结果是a long.
第三,如果任一操作数是unsigned,则结果是无符号的.所以,如果你有long * unsigned int,那么long和unsigned int它们都被提升为一个unsigned long,结果是一个unsigned long.
如果任一操作数具有浮点类型,则执行浮点运算: float,double或long double使用(哪一个取决于操作数的类型;用于确定结果类型的完整表可以在开头链接的页面上找到这个答案).
请注意,结果类型不依赖于操作数的值.在知道值之前,编译器必须在编译时选择类型.
如果结果s * i * i超出了结果类型的范围(int在您的场景中),那么您运气不好:您的程序无法在运行时决定,"哦,我应该切换到使用long!" 因为必须在编译时选择结果类型.