Строка заканчивается одним нулевым байтом. Поскольку 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;
}
Загрузка целого числа из меньшего типа не сохраняет биты, которых не было в меньшем типе; они очищаются (или устанавливаются расширением знака для подписанных типов).
Так:
int x = 0xfeefd00d;
x = (char) 1;
оставляет значение 1
как целое число в x
, нет0xfeedf001
.
Когда переменная используется в выражении вместе с переменными разных типов (например, при присваивании в условии цикла), создается неявное преобразование. Конверсии преобразуются только между типы, но, если возможно, сохраняют значение.
Поэтому, когда вы достигаете нулевого терминатора в str
, он преобразуется (фактически продвинутый) в int
, сохраняя значение 0
. И 0
всегда "false", что завершает цикл.