[应用方案] 一个容易被忽视的溢出问题

[复制链接]
 楼主| 1988020566 发表于 2024-9-9 08:08 | 显示全部楼层 |阅读模式
8位单片机中一个容易被忽视的溢出问题

例:

uint16 wTmp ;  
uint8 x ;

x=2;

wTmp = (uint16)(x*150);

各位,以上这个乘法有没有问题?wTmp的值是多少?

相信有很多人都会不加思考的说,没问题啊!wTmp=300 。

好,问题来了!告诉你,其实结果是 wTmp=44。
这里不作具体解释,请读者自已思考,下次在遇到类似此情况
的时候千万有小心!

正确写法:

x=2;

wTmp = (uint16)(x)*150;  //wTmp=300

gygp 发表于 2024-9-13 15:44 | 显示全部楼层
在单片机编程中,确实需要注意数据类型的范围和运算中的溢出问题。
benjaminka 发表于 2024-9-14 14:24 | 显示全部楼层
通过选择合适的数据类型、进行范围检查、优化算法和利用硬件特性,可以有效地避免数据溢出带来的不良影响。
deliahouse887 发表于 2024-9-14 17:10 | 显示全部楼层
数据溢出是一个常见且容易被忽视的问题。
belindagraham 发表于 2024-9-14 19:35 | 显示全部楼层
熟悉所使用的单片机的数据类型和运算规则,特别是对于8位单片机,要注意数据类型的字节长度限制。
nomomy 发表于 2024-9-14 19:57 | 显示全部楼层
为了避免这些问题,开发者需要养成良好的编程习惯,合理管理内存使用,避免不必要的内存泄漏和溢出。
timfordlare 发表于 2024-9-14 22:07 | 显示全部楼层
当一个有符号整数的值超出了其表示范围时,会发生溢出。例如,对于8位有符号整数(范围为-128到127),如果计算结果是128,那么实际结果将是-128,因为最高位(符号位)被解释为负数。
mollylawrence 发表于 2024-9-15 08:05 | 显示全部楼层
数据溢出发生在计算结果超出了变量所能表示的范围时。
tabmone 发表于 2024-9-15 10:53 | 显示全部楼层
在复杂的计算中,中间结果可能会超出预期的数据类型范围。比如在连续的乘法和加法运算中,每一步的结果可能逐渐增大,最终超出变量所能存储的范围。
backlugin 发表于 2024-9-15 11:55 | 显示全部楼层
单片机中不同的数据类型有特定的取值范围。例如,8 位无符号整数(uint8_t)的取值范围是 0 到 255。当数值超出这个范围时,就会发生溢出。
dspmana 发表于 2024-9-15 13:00 | 显示全部楼层
可以使用括号来明确地表明你的意图,使得代码更易读。
hudi008 发表于 2024-9-15 13:37 | 显示全部楼层
在单片机编程中,数据溢出是一个常见的问题,尤其是在处理有符号整数和无符号整数时。
phoenixwhite 发表于 2024-9-15 15:12 | 显示全部楼层
选择足够大的数据类型来存储可能的计算结果。
youtome 发表于 2024-9-15 20:35 | 显示全部楼层
无符号整数的溢出行为可能与有符号整数不同。当一个无符号整数的值超出了其表示范围时,结果将是该值对最大值的模。例如,对于8位无符号整数(范围为0到255),如果计算结果是256,那么实际结果将是0。
tifmill 发表于 2024-9-15 21:58 | 显示全部楼层
这个问题涉及到C语言中的类型转换和溢出问题。
10299823 发表于 2024-9-16 08:57 | 显示全部楼层
在编程时,根据实际需求选择足够大的数据类型来存储变量。如果可能出现较大的数值,应考虑使用 16 位或 32 位的整数类型,而不是局限于 8 位类型。
cemaj 发表于 2024-9-16 12:20 | 显示全部楼层
对于有符号数和无符号数的选择也要谨慎,根据数值的正负情况来确定合适的数据类型。
dspmana 发表于 2024-9-16 12:45 | 显示全部楼层
在单片机编程中,要充分认识到数据溢出问题的潜在风险,采取有效的预防措施,以确保程序的正确性和稳定性。
jtracy3 发表于 2024-9-16 16:24 | 显示全部楼层
溢出通常发生在将一个较大的数值赋给一个较小的数据类型变量时,或者在进行超出数据类型表示范围的运算时。
wwppd 发表于 2024-9-16 17:40 | 显示全部楼层
在这个例子中,x 和常量 150 都是 uint8_t,所以乘**在 uint8_t 的范围内进行。2 * 150 的结果是 300,这超过了 uint8_t 的最大值 255,因此结果将会被截断。对于 8 位无符号整数来说,300 减去 256(即超过的最大值)等于 44。这就是为什么如果没有正确的类型提升,结果会是 44。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

420

主题

10981

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部