Я помогал кому-то с домашней работой и столкнулся с этой странной проблемой. Проблема в том, чтобы написать функцию, которая меняет порядок байтов целого числа со знаком (так или иначе была указана функция), и вот решение, которое я придумал:
int reverse(int x)
{
int reversed = 0;
reversed = (x & (0xFF << 24)) >> 24;
reversed |= (x & (0xFF << 16)) >> 8;
reversed |= (x & (0xFF << 8)) << 8;
reversed |= (x & 0xFF) << 24;
return reversed;
}
Если вы передадите 0xFF000000
этой функции, первое присваивание приведет к 0xFFFFFFFF
. Я не очень понимаю, что происходит, но я знаю, что это как-то связано с преобразованиями назад и вперед между подписанным и неподписанным или что-то в этом роде.
Если я добавлю ul
к 0xFF
, он будет работать нормально, что, я полагаю, происходит из-за того, что он вынужден подписать без знака, а затем преобразовать в подпись или что-то в этом направлении. Результирующий код также изменяется; без спецификатора ul
он использует sar (арифметическое смещение вправо), но в качестве беззнакового он использует shr по назначению.
Я был бы очень признателен, если бы кто-то мог пролить свет на это для меня. Я должен был знать это, и я думал, что знал, но я действительно не уверен, что здесь происходит.
Заранее спасибо!