Из документации оператора >> :
При арифметическом сдвиге вправо биты, сдвинутые за крайнюю правую позицию бита, отбрасываются, а крайний левый (знаковый) бит распространяется на позиции битов, освобожденные слева. Это означает, что если шаблон имеет отрицательное значение, освободившиеся позиции устанавливаются в единицу; в противном случае они устанавливаются на ноль.
Если вы используете тип данных со знаком, F0B04080
имеет отрицательный знак (бит 1
в начале), который копируется в свободные позиции слева.
Кстати, это не что-то специфичное для VB.NET: variable >> 4
переводится в IL-инструкцию shr
, которая является «арифметическим сдвигом» и, напротив, сохраняет знак к инструкции по сборке x86 SHR
, которая является беззнаковым сдвигом. Для выполнения арифметического сдвига в ассемблере x86 можно использовать SAR
.
Чтобы использовать беззнаковое смещение в VB.NET, вам нужно использовать беззнаковую переменную:
Dim variable As UInteger = &HF0D04080UI
Символ UI
типа в конце F0D04080
сообщает VB.NET, что литерал представляет собой целое число без знака (в противном случае он будет интерпретирован как целое число со знаком минус, и в результате будет получено назначение во время компиляции).