Почему этот цикл реализации djb2 завершается? - PullRequest
0 голосов
/ 08 апреля 2019

Строка заканчивается одиночным нулевым байтом. Поскольку int больше, чем char, как int может стать 0 и последовательно завершить цикл?

источник: http://www.cse.yorku.ca/~oz/hash.html

unsigned long
hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Загрузка целого числа из меньшего типа не сохраняет биты, которых меньший тип не имел;они очищаются (или устанавливаются расширением знака для подписанных типов).

Итак:

int x = 0xfeefd00d;
x = (char) 1;

оставляет значение 1 в виде целого числа в x, не 0xfeedf001.

1 голос
/ 08 апреля 2019

Когда переменная используется в выражении вместе с переменными различных типов (как в присваивании в условии цикла), выполняется неявное преобразование . Преобразования конвертируются только между типами , но при возможности сохраняют значение.

Таким образом, когда вы достигаете нулевого терминатора в str, он преобразуется (на самом деле повышен ) в int, сохраняя значение 0. И 0 всегда "ложно", что завершает цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...