在C语言程序中,对常数做强制类型转换当然不是没有意义的,例如(int)3.14将只保留整数部分。即使是从整型转换为整型也是有意义的,强制类型转换可以限定常数的宽度。
例如下面这行C语言赋值语句:
intres=(unsignedchar)0xffff;
该语句执行完成后,res中的数值将为0xff,而不是0xffff。当然了,在实际的C语言程序开发中,也可以将ret声明为unsignedchar型,这样就可以省去对常数0xffff的强制类型转换了。
如果题主觉得上面这个例子没有实际应用价值,再来看下面这段C语言代码:
编译并执行这段C语言代码,会输出什么呢?请看:
居然不是14600000000!事实上,这段简短的C语言代码常常会让初学者百思不得其解,甚至会怀疑C语言或者计算机有问题,出故障了。
其实原因很简单,就是数据溢出了而已。以偶的机器为例,在C语言程序的计算过程中,所有乘数默认都是int型的,上述C语言代码中的两个常数的乘法运算结果显然超出了int型能够表示的最大数据,当然会出错了。
这其实是一个隐藏的较深的错误,稍微有些经验的C语言程序员能够避开变量的数据溢出,因为C语言中的变量总是需要使用数据类型定义的,而某种数据类型能够表达的数据范围,程序员心里一般都有一把标尺。但是常数导致的数据溢出,很多程序员就容易忽略了。
要改正上述C语言代码的错误其实很简单,只需将任意一个乘数转换为宽度更宽的数据类型就可以了,相关C语言代码如下,请看:
编译并执行这段C语言代码,发现输出与预期一致了。
可见,题目中的“强制类型转换后,还是那个数”的说法是不准确的,在C语言程序中,即使是对常数强制类型转换,也是有意义的。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢偶的文章就关注一波吧,可以看到最新更新和之前的文章哦。