打印
[技术问答]

用“UL”避免Keil C51大整数常量运算溢出错误

[复制链接]
89|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wengh2016|  楼主 | 2024-6-29 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用“UL”避免Keil C51大整数常量运算溢出错误在Keil C51中,使用整数常量运算可能出现溢出错误,特别是在处理大整数时。这是因为C51编译器的默认类型整数常量运算可能出现溢出错误。如果不指定大整数的数据类型,编译器将根据其实际大小确定其类型,从而可能导致溢出错误。在ANSI C规范中,十进制整数常量的默认数据类型是int、long int和unsigned long int的其中一种。编译器总是按尽可能的原则指定常量的类型。如果常数在-32768~32767之间,则按int类型处理;如果常数超过int类型的表示范围,则按long int或unsigned long int类型处理。但是,这一原则并不总能奏效。在某些情况下,两个常量做运算时可能导致溢出错误。例如,在Keil C51中,宏替换后为:i = 22118400 * 100 / (65536 * 1000);编译器首先为22118400定义类型,因为22118400不在int的表示范围内,而在long int的范围-2147483648~2147483647内,所以22118400按long int类型处理。在做乘积运算时100被自动按longint处理,22118400 * 100将按带符号长整型常量进行运算,运算结果仍为带符号长整型,结果写成十六进制是0x83D60000,其十进制是-2083127296,显然出现了溢出错误。解决这种溢出错误的方法是使用“UL”指定大整数的数据类型,即:#define SYSCLK 22118400UL这样可以将22118400指定为无符号长整型,从而避免溢出错误。这也是为了提高代码的可读性和规范性。在编程中,我们需要注意大整数常量运算的溢出错误,并采取相应的措施来避免溢出错误。指定大整数的数据类型是避免溢出错误的有效方法。此外,我们还需要注意Keil C51编译器的默认类型整数常量运算可能出现溢出错误,即使编译器没有给出任何错误或警告提示信息。因此,在编程中,我们需要时刻注意溢出错误的可能,并采取相应的措施来避免溢出错误。用“UL”指定大整数的数据类型是避免Keil C51大整数常量运算溢出错误的有效方法。这不仅可以避免溢出错误,还可以提高代码的可读性和规范性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

2545

帖子

1

粉丝