使用 Microchip 18f4620 PIC。不过,这应该是一个标准的 ANSI C 问题。
说我有
unsigned int16 badFlow=65535 //max unsigned int16 value
这具有
1111 1111 1111 1111
的二进制值。如果我那时
badFlow++;
位模式变为
1 0000 0000 0000 0000
17 位。显然 badFlow == 0
,但额外的翻转位byte* flowPtr = &badFlow+2;
的任何地方点。
我假设是后者,但希望是前者。
我的问题:一位同事编写了一些带有计数器的错误代码,该代码已在所有生产的产品上溢出约 2 年。考虑到我们的客户使用这些工具所收取的费用,由于潜在的不良数据,这意味着数百万美元的风险。
最佳答案
C 中的算术使用 值 进行,而不是内存中的字节。您的表达式 badFlow++
等效于 badFlow = badFlow + 1
。右侧被评估为 int
类型(由于默认促销,假设 int
大于 16 位;如果 int
只有 16 位,那么它将被评估为 unsigned int
)导致 65536,那么当 65536 被分配到一个无符号16 位变量,以 65536 为模减少,结果为 0。
摆脱这个答案的重要一点是 badFlow++
不是对 &badFlow
内存的直接操作(尽管它可能在某些实现中实现)。它只是加法和赋值的简写。
关于c - PIC 中的整数溢出——流程去哪里了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8793272/