3、深入数据类型与变量

内容概要:掌握和理解数据类型变量之间的转换方式。

1、程序中数值(字面量)类型,不同类型的变量(字面量)相互赋值会发生什么?

// 实例分析
int a = 50000;	// 50000是一个字面量,默认类型是int,去初始化一个int类型的变量a;valid
short b = 0;	// 0是一个字面量,默认类型是int,去初始化一个short类型的变量b;类型不匹配,可能有问题

b = a;	// 赋值操作,将int类型变量a的值,传递给short类型的变量b

思考:在前一课的学习中,int类型是一个大酒杯,short类型是一个小酒杯,对于上面第3行和第5行的代码,都是在把大酒杯里的酒倒入小酒杯中,那么此时会有问题么?
很明显这两个类型的酒杯都有各自的容量,对于字面量0,在short类型的范围内(-215~215-1),所以应该不会溢出(大酒杯里的酒比小酒杯容量小);对于字面量50000,超过了short的范围,(大酒杯里的酒比小酒杯的容量大了,强行大的往小的里倒酒,自然会溢出)所以会出现问题。

// 编译结果:
short b=0;	// valid, output: b = 0;
b = a; 		// valid, output: b = -15536

编译结果也确实出现了问题, 为什么b赋值后会是-15536这么奇怪的值呢?(此处在后续C进阶中有涉及)
所以,对于大类型的值传递给小类型是有风险的。可能正常:大类型的值在小类型的表示范围内(类比酒杯);可能溢出:大类型的值超过了小类型的表示范围。

// 浮点型到整形的转换
int c = 0;
float d = 0.2;	// 0.2的字面量类型是double,但并不会出现问题,因为0.2是在float表示的范围内。

c = d;		// 浮点类型给整形变量赋值,会出问题么?整形数没有小数点,那么很可能小数部分就不在了。

// 编译结果
c = 0;	// 确实发生了截断,小数部分没了

2、类型转换

事实上第1点中在讨论的不同数据类型间的赋值操作,就是在进行的类型转换。
C语言中不同类型的变量之间(变量与值之间)进行赋值或运算时,会发生类型转换类型转换不会改变原变量的值(仅仅是被赋值的变量的值发生改变,可能会不正常)。

默认类型转换:对于short s = 2;编译器知道字面量2的默认类型是int(和short不匹配),但也明确的知道初始化操作可以成功,因为2在short类型可表示的范围内。因此编译器就会悄悄的把字面量2的类型转换为short,这就是编译器背后做的工作。

强制类型转换:

// C语言中可以进行强制类型转换,语法规则是:
type name = (type)var;

int i = 40000;
short b = (short)i;

printf("i = %d\n", i);	//	i = 40000
printf("b = %d\n", b);	//  b = -25536

以上代码输出结果也表明了,类型转换不会改变原变量的值,实际进行的操作是对原来变量i复制了一份副本出来,然后对该副本进行了一系列的转换操作,最终得到的是一个溢出后的不符合预期的结果,将该结果传递给了变量b。

所以我们对于类型转换一定要保持警惕!也提醒我们上一课的强调点:时刻要记得当前变量的具体类型是什么!

后续需答疑点:1、int到short转换会溢出的问题,值为什么是-15536?(后续博客更新后附链接)

本文是狄泰软件学院唐老师系列课程的学习总结,用于个人复习以及与大家探讨学习,如有理解有误的地方恳请大佬们予以指正,十分感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值