Кстати, поковырялся в дизассемлинге студии. Действительно генерируется неожиданный код, и в
ecx попадает неверное значение. Видимо, программа не падает исключительно по везению, так как в студии char всё же signed по умолчанию.
Вот первый дизассемблинг:
Код: Выделить всё
; ++table[str[i]]
00BA144C mov eax,dword ptr [ebp+8]
00BA144F add eax,dword ptr [i]
00BA1455 movsx ecx,byte ptr [eax]
00BA1458 mov dl,byte ptr [ebp+ecx-108h]
00BA145F add dl,1
А вот дизассемблинг поправленного варианта:
Код: Выделить всё
; ++table[(unsigned char)str[i]]
010F144C mov eax,dword ptr [ebp+8]
010F144F add eax,dword ptr [i]
010F1455 movzx ecx,byte ptr [eax]
010F1458 mov dl,byte ptr [ebp+ecx-108h]
010F145F add dl,1
Видно, что команда
movsx (копирование со знаковым расширением) изменилась на
movzx (копирование с нулевым расширением), что отразилось на значении
ecx.
Итого, подтверждаю, что критика для студии действительно актуальна, и правильной будет строка:
Однако отмечу, что gcc и mingw работают корректно и без кастинга.