TLDR: ваше целое число b отрицательно, поэтому при смещении вправо значение самого старшего бита (т. Е. 1) остается прежним.Поэтому, когда вы сдвигаете b вправо на 24 места, вы в конечном итоге получаете 0xFFFFFFFF.
Более подробное объяснение:
Предполагая на вашей платформе, что ваши целые числа 32-битные или более длинные, а целое число со знаком представляет 2дополнить затем 0xFFFF0000, назначенный целой переменной со знаком, является отрицательным числом.Если int длиннее 32 бит, то 0xFFFF0000 будет сначала расширяться знаком и будет по-прежнему отрицательным числом.
Сдвиг вправо на отрицательное число является реализацией, определенной стандартом (C99 / N1256, раздел 6.5.7.5):
Результатом E1 >> E2 является E1-сдвинутая вправо позиция бита E2.[...] Если E1 имеет тип со знаком и отрицательное значение, полученное значение определяется реализацией.
Это означает, что конкретный компилятор может выбирать, что происходит в конкретной ситуации, но это должно бытьв руководстве по компилятору указано, каков эффект.
Во многих процессорах, как правило, существует два набора команд сдвига: логический сдвиг и арифметический сдвиг.Логическое смещение вправо сместит биты и заполнит выставленные биты нулями.Арифметические сдвиги вправо (если допустить повторение дополнения до 2) будут заполнять открытые биты тем же самым битовым значением старшего значащего бита, чтобы он заканчивался результатом, который согласуется с использованием сдвигов в качестве деления на 2. (Например, -4>> 1 == 0xFFFFFFFC >> 1 == 0xFFFFFFFE == -2.)
В вашем случае оказывается, что разработчик компилятора выбрал использование арифметических сдвигов при применении к целым числам со знаком и, следовательно, результат сдвигаотрицательное значение справа остается отрицательным значением.В терминах битовых шаблонов 0xFFFF0000 >> 24 дает 0xFFFFFFFF.
Если вы не абсолютно уверены в том, что вы делаете, лучше всего выполнять побитовые операции только с неподписанными типами, поскольку их внутреннее представление можно безопасно рассматривать как коллекциюбит.Возможно, вы также захотите убедиться, что все числовые значения, которые вы используете в этом случае, не подписаны, добавив суффикс без знака к вашему номеру.