首页 >

C语言对常数做强制类型转换,有意义吗?无论如何转换,不还是那个数吗? – 网络|

vray灯光阴影怎么设置,树莓派怎么装软件啊,网站子站点是什么意思C语言对常数做强制类型转换,有意义吗?无论如何转换,不还是那个数吗? - 网络|C语言对常数做强制类型转换,有意义吗,无论如何转换,不还是那个数吗

在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等嵌入式开发,喜欢偶的文章就关注一波吧,可以看到最新更新和之前的文章哦。


C语言对常数做强制类型转换,有意义吗?无论如何转换,不还是那个数吗? - 网络|
  • line函数? - 网络|
  • line函数? - 网络| | line函数? - 网络| ...

    C语言对常数做强制类型转换,有意义吗?无论如何转换,不还是那个数吗? - 网络|
  • c语言c怎么打出来? - 网络|
  • c语言c怎么打出来? - 网络| | c语言c怎么打出来? - 网络| ...

    C语言对常数做强制类型转换,有意义吗?无论如何转换,不还是那个数吗? - 网络|
  • 指针穿越C语言,掌握字符串方法,BAT等一线互联网公司等你来做运营 - 网络|
  • 指针穿越C语言,掌握字符串方法,BAT等一线互联网公司等你来做运营 - 网络| | 指针穿越C语言,掌握字符串方法,BAT等一线互联网公司等你来做运营 - 网络| ...