C++类型转换形式很多,尤其是隐式转换的模糊很容易导致程序的各种问题。
所以我参考了Cppreference简单做了一点总结:
一:算数隐式转换
当表达式两个值进行运算时,首先会进行类型提升,其提升规则如下:
简单点来说,当两个值进行运算时,会将两个操作数都提升为等级最高的操作数的类型。(上图从左到右等级由低到高)
但是当两个操作数都为int型及其以下时,会将其全部提升为int型或uint型中可完整表示的较小的一个,原因是有的平台int和short长度是相等的,为了能完整表示ushort,会将其提升为uint型(在vs中int及以下全部提升为int)。
*同一个虚线框内的提升是不损失精度的。
下图是在vs2017,64位编译器下实验代码和结果。
int main()
{
bool bol = true;
char c=1,c2=1;
unsigned char cc=1, cc2=1;
short s=1;
unsigned short ss = 1;
int i = 1;
unsigned int ii = 1;
long l = 1;
unsigned long ll = 1;
long long dl = 1;
unsigned long long ddl = 1;
float f = 1;
long float ff = 1;
double d = 1;
long double dd = 1;
int t = 2147483647;
unsigned int tt = 4294967295;
const std::type_info& z = typeid(bol);
printf("bool: %d %s\n", sizeof(bol),z.name());
printf("char+char: %d %s\n", sizeof(c+c2), typeid(c+c2).name());
printf("uchar+uchar: %d %s\n", sizeof(cc + cc2), typeid(cc + cc2).name());
printf("short+short: %d %s\n", sizeof(s + s), typeid(s + s).name());
printf("ushort+ushort: %d %s\n", sizeof(ss+ss), typeid(ss + ss).name());
printf("int + uchar: %d %s\n", sizeof(i + cc), typeid(i + cc).name());
printf("int + uint: %d %s\n", sizeof(i + ii), typeid(i + ii).name());
printf("uint+char: %d %s\n", sizeof(ii + c), typeid(ii+c).name());
printf("long+uchar: %d %s\n", sizeof(l + cc), typeid(l + cc).name());
printf("ulong+char: %d %s\n", sizeof(ll+c), typeid(ll + c).name());
printf("long long+uchar:%d %s\n", sizeof(dl + cc), typeid(dl + cc).name());
printf("ulong long+char:%d %s\n", sizeof(ddl + c), typeid(ddl + c).name());
printf("float+long long: %d %s\n", sizeof(f + ll), typeid(f + ll).name());
printf("double+char: %d %s\n", sizeof(d + c), typeid(c + c).name());
printf("特殊测试\n");
printf("int+char: %d %s\n", sizeof(t + c), typeid(t + 10).name());
printf("uint+char: %d %s\n", sizeof(tt + c), typeid(tt + 10).name());
printf("1: %d %s\n", sizeof(1), typeid(1).name());
printf("1.0: %d %s\n", sizeof(1.0), typeid(1.0).name());
printf("4294967296: %d %s\n", sizeof(4294967296), typeid(4294967296).name());
return 0;
}
其中__int64(等价于long long),操作数类型提升是在运算之前确定,一旦确定好类型,运算结果大于提升类型所能表示的范围时将会发生溢出。尤为注意:当表达式操作数大于两个时,将会依据最先运算的两个操作数进行提升,然后依据接下来两个操作数进行提升,而不是依据表达式中最高等级的操作数进行提升。
待续。。。。。。。。。。。。。。。。。。。。