理论教育 编译器设计之路:隐式类型转换时的注意事项

编译器设计之路:隐式类型转换时的注意事项

时间:2023-11-04 理论教育 版权反馈
【摘要】:相信读者对于类型转换应该并不陌生,在C语言中,将类型转换分为隐式转换、显式转换两类。这里,笔者不谈显式转换,因为显式转换的安全性是由程序员保证的。对于编译器来说,显式转换实际上就是一次函数调用的过程。而隐式转换是由编译器自动完成的类型转换,所以有时也称为强制类型转换。在实现隐式类型转换时,语言及编译器设计者应当注意如下几点:损失精度处理。有符号类型与无符号类型互转。当a的值为200时,转换结果为-55。

编译器设计之路:隐式类型转换时的注意事项

相信读者对于类型转换应该并不陌生,在C语言中,将类型转换分为隐式转换、显式转换两类。C语言是弱类型语言,对于类型转换的限制很少,当然,其中也包括了一些不安全的转换。这里,笔者不谈显式转换,因为显式转换的安全性是由程序员保证的。对于编译器来说,显式转换实际上就是一次函数调用的过程。而隐式转换是由编译器自动完成的类型转换,所以有时也称为强制类型转换。隐式转换并不需要程序员授权,而转换的安全性也是由编译器保证的。一般而言,程序设计语言对隐式转换的基本要求就是保证安全,对于一些存在一定不安全因素的隐式转换宁可不做。Pascal语言在隐式转换方面是非常谨慎的,例如,real转integer、integer转char等转换都不作为隐式转换的范畴,需要程序员编码完成。

在实现隐式类型转换时,语言及编译器设计者应当注意如下几点:

(1)损失精度处理。例如,C语言中,float转int时,小数部分应该如何处理呢?选择舍尾法取整还是四舍五入取整是语言设计者应该考虑的问题。

(2)有符号类型与无符号类型互转。在这种情况下,必须考虑如何处理符号位。通常的做法是忽略符号位的存在。例如,无符号字符类型变量a转换成有符号字符类型变量时,直接将其按字节复制即可。当a的值为200时,转换结果为-55。(www.daowen.com)

(3)有符号扩展的处理。例如,将signed char转为int时,一定要注意按符号位扩展。

最后,笔者有一句忠告,语言中广泛应用隐式转换并非上上之策。实际上,C语言的隐式转换在学界是受到质疑的,它可能会使一些本来非常明显的错误被隐藏。对于程序员而言,这是非常可怕的,因为无法预知“定时炸弹”何时引爆。正确评价与利用隐式转换机制是有现实意义的,安全性是需要考虑的最重要因素。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈