Результат операции по модулю отрицательный

Почему следующий код 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");
            }
    }

person leonixyz    schedule 18.12.2014    source источник
comment
код должен использовать беззнаковый символ. Поскольку все значения выше 0x7F имеют установленный бит знака.   -  person user3629249    schedule 18.12.2014
comment
Возможный дубликат операции по модулю с отрицательными числами   -  person phuclv    schedule 13.05.2017


Ответы (1)


Давайте посмотрим на эту строку кода:

buf[i] = i%256;

Здесь i % 256 вычисляется как значение типа int. Однако buf представляет собой массив из char, поэтому, когда значение присваивается массиву, оно усекается до char. Если результат модуля находится за пределами диапазона положительных значений, которые могут быть сохранены в char, он может закончиться тем, что вместо этого будет сохранен как отрицательное число.

Другими словами, дело не в том, что модуль выдает отрицательное значение, а в том, что вы сохраняете результат в типе, который не может его удерживать. Попробуйте изменить массив на массив int или массив unsigned char и посмотрите, исправит ли это ситуацию.

Надеюсь это поможет!

person templatetypedef    schedule 18.12.2014
comment
Это НЕ то, что происходит. Скорее результаты операции по модулю находятся в диапазоне от 0 до 255 (от 0x00 до 0xFF), и все результаты выше 0x7F считаются отрицательными (бит знака символа равен «1»), исправление заключается в использовании беззнакового символа. - person user3629249; 18.12.2014
comment
@user3629249 user3629249 То, что вы описываете, это то, что я собираюсь сказать здесь. Можете ли вы указать, что в моем ответе неправильно, чтобы я мог обновить его, чтобы более четко сообщить, что происходит? - person templatetypedef; 18.12.2014
comment
@ user3629249 - То, что вы написали, очень близко к тому, что написал templatedypedef в этом ответе. На самом деле то, что написал templatedypedef, на самом деле более правильно, чем то, что вы написали, потому что ответ говорит, что это может в конечном итоге обернуться вокруг. Является ли простой char подписанным или беззнаковым, явно отмечено в стандарте (разделы 6.2.5 и 6.3.1.1) как поведение, определяемое реализацией. - person David Hammen; 19.12.2014