模运算的结果是负数。

3
下面的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");
            }
    }

代码需要使用无符号字符。因为所有大于0x7F的值都设置了符号位。 - user3629249
ANSI C或ISO C是否规定了-5%10应该是什么? 带负数的模运算 为什么C和Ruby在负整数的模运算符(%)行为不同? - phuclv
可能是负数取模运算的重复问题。 - phuclv
1个回答

7

让我们来看一下这行代码:

buf[i] = i%256;

在这里,i%256被计算为int类型的值。然而,buf是一个char数组,因此当该值被赋予数组时,它将被截断为一个char。如果模数的结果超出了可以存储在char中的正值范围,则可能会绕过并存储为负数。

换句话说,问题不在于取模产生了负数值,而是你将结果存储在无法容纳它的数据类型中。尝试将数组更改为int数组或unsigned char数组,看看是否可以解决问题。

希望能对您有所帮助!


这不是正在发生的事情。相反,模运算的结果范围从0到255(0x00到0xFF),所有大于0x7F的结果都被视为负数(char符号位为“1”)。修复方法是使用无符号字符。 - user3629249
@user3629249,您所描述的正是我想要表达的。您能指出我的回答哪里不正确,以便我更新它,更清楚地传达正在发生的事情吗? - templatetypedef
1
@user3629249 - 你所写的内容与templatedypedef在这个答案中写的非常接近。实际上,templatedypedef所写的比你写的更正确,因为答案中说“它可能会绕回”。普通的char是有符号还是无符号,在标准中明确标注为实现定义行为(第6.2.5节和6.3.1.1节)。 - David Hammen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接