Некоторые из сдвинутых a [i], когда они автоматически преобразуются из unsigned char
в int
, дают значения с расширенным знаком.
Это согласуется с разделом 6.3.1 Арифметические операнды, подраздел 6.3.1.1 Булевы, символы и целые числа, из проекта стандарта C N1570, который частично читается как «2. Следующее может использоваться в выражении везде, где int или unsigned int могут использоваться: ... - Объект или выражение с целочисленным типом (кроме int или unsigned int)
чей целочисленный конверсионный ранг меньше или равен рангу int и unsigned int. ... Если int может представлять все значения исходного типа ..., значение преобразуется в int; в противном случае он конвертируется в беззнаковое целое. Они называются целочисленными акциями. ... 3. Целочисленные акции сохраняют значение, включая знак. "
См., Например, www.open-std.org / JTC1 / SC22 / WG14 / www / docs / n1570.pdf
Вы можете использовать код, подобный следующему, который работает нормально:
int i;
for (i=3, ts=0; i>=0; --i) ts = (ts<<8) | a[i];