【问题标题】:The result of a modulo operation is negative模运算的结果是否定的
【发布时间】:2015-02-16 16:26:05
【问题描述】:

为什么下面的 C 代码会产生负数作为输出?以及如何防止这种情况发生?

    #include <stdio.h>

    int main()
    {
            int i;
            char buf[1024];
            for (i = 0; i < 1024; i++)
                    buf[i] = i%256;

            for (i=0; i<1024; i++) {
                    printf("%d ", buf[i]);
                    if (i%32==31)
                            printf("\n");
            }
    }

【问题讨论】:

标签: c math modulo negative-number


【解决方案1】:

我们来看这行代码:

buf[i] = i%256;

这里,i % 256 被计算为 int 类型的值。但是,buf 是一个由chars 组成的数组,因此当将值分配到数组中时,它会被截断为char。如果模数的结果超出了可以存储在 char 中的正值范围,则它可能最终会回绕并存储为负数。

换句话说,模数产生的负值并不像您将结果存储在无法容纳它的类型中那样多。尝试将数组更改为 int 数组或 unsigned char 数组,看看是否能解决问题。

希望这会有所帮助!

【讨论】:

  • 这不是正在发生的事情。相反,模运算的结果范围从 0 到 255(0x00 到 0xFF),所有高于 0x7F 的结果都被认为是负数(char 符号位为 '1')解决方法是使用 unsigned char
  • @user3629249 你所描述的就是我要在这里说的。您能否指出我的答案不正确,以便我可以更新它以更清楚地传达正在发生的事情?
  • @user3629249 - 您所写的内容与 templatedypedef 在此答案中所写的内容非常接近。实际上,templatedypedef 所写的内容实际上比您所写的更正确,因为答案是“它可能最终会环绕”。普通的char 是有符号还是无符号在标准(第 6.2.5 和 6.3.1.1 节)中明确标记为实现定义的行为。
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2016-01-19
  • 2014-07-09
相关资源
最近更新 更多