by fk0 » 18 Jun 2013, 16:46
У тебя вначале вычисляется значение в квадратных скобках. Вычисляется оно по правилам языка C для используемых там типов... А потом полученное значение приводится к ssize_t и используется как индекс массива. Во всех 64-бит дата моделях ssize_t или ptrdiff_t (чё там для индексов используется, не знаю) будет 64-битным. Ты пишешь 0-(uint32_t)c. Результат выражения -- uint32_t, число близкое к 4-м миллиардам. Согласен? А теперь приведём его (побитово) к 64-битовому знаковому. Будь у нас на входе знаковое число -- привелось бы нормально. А беззнаковое -- sign expansion в машинных командах делаться не будет и старшие разряды останутся нулевыми. Полная хуйня!
Почему так? Потому, что за бездумное использование беззнаковых чисел везде где попало, в частности в индексах, я считаю, сжигать нужно. По таким вот причинам. Или по таким, что для беззнаковых чисел алгебра не работает. Из "a+b > c" не следует "a > c-b", например.
* Origin: зип файл! (2:5030/1559)