C 类型转换 隐式

类型转换问题需要十分重视,很多程序问题都处在这里,尤其是隐式类型转换。懂得规则,才能胜出。

先看一段代码,如果能全部猜对输出,恭喜你,过关!



using namespace std;

int main(void)
{
	unsigned int a = 20;
	int b = -a;
	long long c = -a;
	long d = -a;
	double e = -a;
	float f = -a;
	__int32 g = -a;
	__int64 h = -a;
	
	cout<<a<<endl;
	cout<<b<<endl;
	cout<<c<<endl;
	cout<<d<<endl;
	cout<<e<<endl;
	cout<<f<<endl;
	cout<<g<<endl;
	cout<<h<<endl;
	
	return 1;
}

正确输出:



看到这里,说明我们对于数据类型的隐式转换还有一些疑惑。讲解之前需要保证了解计算机如何表示负数

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。

正整数的补码与原码相同。负整数的补码,符号位不变,数值位各位取反,最后整个数加1。

举个例子,比如十进制整型5(32位机器):


原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011(-5    反码+1)


隐式类型转换原则:

1、当表达式中存在有符号类型和无符号类型的时候,所有的操作数都自动转换为无符号类型。
2
、基本数据类型 基本数据类型的转换以取值范围的作为转换基础(保证精度不丢失)。隐式转换发生在从小->大的转换中。

3、子类对象可以隐式的转换为父类对象。
4、转换顺序 char >> unsigned char >> int >> unsigned int >> long long >> unsigned long long 

5、转换顺序   char >> unsigned char >> int >> unsigned int >> double >> unsigned double

6、赋值运算时,优先转换为被赋值变量的类型。


解释一下开头代码结果:

int b = -a;  -a 即符号位置1 所以b为-20

long long c = -a;  符号位变为1,同时拷贝给c的低字节位置,得到很大的正数。e f h的结果与c一样。

 long d 由于long在我的电脑上和int一样是32位的,所以d为-20。g的结果与d一样。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值