C++之类型转换

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),操作数类型提升是在运算之前确定,一旦确定好类型,运算结果大于提升类型所能表示的范围时将会发生溢出。尤为注意:当表达式操作数大于两个时,将会依据最先运算的两个操作数进行提升,然后依据接下来两个操作数进行提升,而不是依据表达式中最高等级的操作数进行提升。

 

待续。。。。。。。。。。。。。。。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blanklog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值