打印
[应用方案]

一个容易被忽视的溢出问题

[复制链接]
380|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
数据溢出是一个常见且容易被忽视的问题。

使用特权

评论回复
5
belindagraham| | 2024-9-14 19:35 | 只看该作者
熟悉所使用的单片机的数据类型和运算规则,特别是对于8位单片机,要注意数据类型的字节长度限制。

使用特权

评论回复
6
nomomy| | 2024-9-14 19:57 | 只看该作者
为了避免这些问题,开发者需要养成良好的编程习惯,合理管理内存使用,避免不必要的内存泄漏和溢出。

使用特权

评论回复
7
timfordlare| | 2024-9-14 22:07 | 只看该作者
当一个有符号整数的值超出了其表示范围时,会发生溢出。例如,对于8位有符号整数(范围为-128到127),如果计算结果是128,那么实际结果将是-128,因为最高位(符号位)被解释为负数。

使用特权

评论回复
8
mollylawrence| | 2024-9-15 08:05 | 只看该作者
数据溢出发生在计算结果超出了变量所能表示的范围时。

使用特权

评论回复
9
tabmone| | 2024-9-15 10:53 | 只看该作者
在复杂的计算中,中间结果可能会超出预期的数据类型范围。比如在连续的乘法和加法运算中,每一步的结果可能逐渐增大,最终超出变量所能存储的范围。

使用特权

评论回复
10
backlugin| | 2024-9-15 11:55 | 只看该作者
单片机中不同的数据类型有特定的取值范围。例如,8 位无符号整数(uint8_t)的取值范围是 0 到 255。当数值超出这个范围时,就会发生溢出。

使用特权

评论回复
11
dspmana| | 2024-9-15 13:00 | 只看该作者
可以使用括号来明确地表明你的意图,使得代码更易读。

使用特权

评论回复
12
hudi008| | 2024-9-15 13:37 | 只看该作者
在单片机编程中,数据溢出是一个常见的问题,尤其是在处理有符号整数和无符号整数时。

使用特权

评论回复
13
phoenixwhite| | 2024-9-15 15:12 | 只看该作者
选择足够大的数据类型来存储可能的计算结果。

使用特权

评论回复
14
youtome| | 2024-9-15 20:35 | 只看该作者
无符号整数的溢出行为可能与有符号整数不同。当一个无符号整数的值超出了其表示范围时,结果将是该值对最大值的模。例如,对于8位无符号整数(范围为0到255),如果计算结果是256,那么实际结果将是0。

使用特权

评论回复
15
tifmill| | 2024-9-15 21:58 | 只看该作者
这个问题涉及到C语言中的类型转换和溢出问题。

使用特权

评论回复
16
10299823| | 2024-9-16 08:57 | 只看该作者
在编程时,根据实际需求选择足够大的数据类型来存储变量。如果可能出现较大的数值,应考虑使用 16 位或 32 位的整数类型,而不是局限于 8 位类型。

使用特权

评论回复
17
cemaj| | 2024-9-16 12:20 | 只看该作者
对于有符号数和无符号数的选择也要谨慎,根据数值的正负情况来确定合适的数据类型。

使用特权

评论回复
18
dspmana| | 2024-9-16 12:45 | 只看该作者
在单片机编程中,要充分认识到数据溢出问题的潜在风险,采取有效的预防措施,以确保程序的正确性和稳定性。

使用特权

评论回复
19
jtracy3| | 2024-9-16 16:24 | 只看该作者
溢出通常发生在将一个较大的数值赋给一个较小的数据类型变量时,或者在进行超出数据类型表示范围的运算时。

使用特权

评论回复
20
wwppd| | 2024-9-16 17:40 | 只看该作者
在这个例子中,x 和常量 150 都是 uint8_t,所以乘**在 uint8_t 的范围内进行。2 * 150 的结果是 300,这超过了 uint8_t 的最大值 255,因此结果将会被截断。对于 8 位无符号整数来说,300 减去 256(即超过的最大值)等于 44。这就是为什么如果没有正确的类型提升,结果会是 44。

使用特权

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

本版积分规则

399

主题

10580

帖子

6

粉丝