Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 模运算的结果为负_C_Math_Modulo_Negative Number - Fatal编程技术网

C 模运算的结果为负

C 模运算的结果为负,c,math,modulo,negative-number,C,Math,Modulo,Negative Number,为什么下面的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++) {

为什么下面的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");
            }
    }
#包括
int main()
{
int i;
char-buf[1024];
对于(i=0;i<1024;i++)
buf[i]=i%256;

对于(i=0;i让我们看看这行代码:

buf[i] = i%256;
这里,
i%256
被计算为类型为
int
的值。但是,
buf
是一个
char
s的数组,因此当该值被分配到数组中时,它被截断为
char
。如果模的结果超出了可以存储在
char
中的正值范围,它可能会d包装起来并存储为负数

换句话说,不是模数产生了负值,而是将结果存储在一个无法保存它的类型中。尝试将数组更改为
int
数组或
unsigned char
数组,看看这是否解决了问题


希望这会有所帮助!

代码需要使用无符号字符。由于0x7F以上的所有值都设置了符号位,因此可能出现的重复情况并非如此。相反,模运算的结果范围为0到255(0x00到0xFF),0x7F以上的所有结果都被视为负数(字符符号位为“1”)解决方法是使用未签名char@user3629249你所描述的正是我想在这里说的。你能指出我的答案有什么不正确的地方吗?这样我就可以更新它以更清楚地传达发生了什么事?@user3629249-你所写的与templatedypedef在这个答案中所写的非常接近。事实上,什么是templatedypedef WRITED实际上比您所写的更正确,因为答案是“它可能会结束”。标准(第6.2.5节和第6.3.1.1节)明确将普通
char
是否签名标记为实现定义的行为。