使用 Microchip 18f4620 PIC。不过,这应该是一个标准的 ANSI C 问题。

说我有

unsigned int16 badFlow=65535 //max unsigned int16 value

这具有 1111 1111 1111 1111 的二进制值。

如果我那时
badFlow++;

位模式变为 1 0000 0000 0000 000017 位。显然 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/

    10-13 00:01