Почему операция по модулю возвращает неожиданное значение

Преобразование строкового поля в Integer:

db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) { 
    obj.field-name = new NumberInt(obj.field-name);
    db.db-name.save(obj);
});

Преобразование целочисленного поля в строку:

db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) {
    obj.field-name = "" + obj.field-name;
    db.db-name.save(obj);
});
16
задан Yu Hao 1 September 2015 в 05:18
поделиться

1 ответ

Это работает (отображает 15) с компилятором Microsoft C (без stdint.h, поэтому я использовал typedef):

#include <stdio.h>
typedef unsigned char uint8_t;

int main(void) {
    uint8_t i = 0;
    i = (uint8_t)(i - 1) % 16;
    printf("i: %d\n", i);
    return 0;
}

Причина 255 в том, что (i - 1) повышен до integer и целочисленное деление, используемое для% в C, округляет до нуля вместо отрицательной бесконечности (округление до отрицательной бесконечности - это то же самое, что и в математике, естествознании и других языках программирования). Так что для C% равен нулю или имеет тот же знак, что и дивиденд (в данном случае -1% 16 == -1), в то время как в математике по модулю ноль или тот же знак, что и у делителя.

2
ответ дан rcgldr 1 September 2015 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: