Логический сдвиг вправо для целых отрицательных чисел в C?

#c #bit

#c #бит

Вопрос:

Как можно выполнить логический сдвиг вправо для отрицательных чисел в C? По сути, я ищу C-эквивалент >>> в java

т. е.

 int one = -16711936 ;
        //int two = -16711936 ;
        //int three = -1;
        int r, g, b;
        System.out.println(Integer.toBinaryString(one));
         r = one << 8;
         r >>>= 24;

         g = one << 16;
         g >>>= 24;  //this always ends up being -1 in C, instead of 255

         b = one << 24;
         b >>>= 24;
  

Комментарии:

1. Сдвиг вправо в C определяется реализацией, что означает, что вы не знаете, является ли это арифметическим или логическим (хотя в большинстве случаев это арифметика). Это означает, что вам нужно выполнить некоторую дополнительную битовую обработку вручную, если вы хотите логический сдвиг (или, ну, приведение).

2. Обычно этого не происходит, потому что, в отличие от Java, вам не нужно.

Ответ №1:

В отличие от Java, C имеет целочисленные типы без знака. Вы всегда должны использовать целочисленные типы без знака для побитовых манипуляций, подобных этому. Если вы не являетесь экспертом в C, выполнение этого со знаковыми типами приведет вас в пугающее царство неопределенного поведения, где демоны вылетают из вашего носа.

Комментарии:

1. Я знал об этом. Однако в Java нет беззнаковых типов, поэтому я не смог это показать.

Ответ №2:

Приведите значение к (unsigned int) перед сдвигом.

Комментарии:

1. А еще лучше, для начала используйте беззнаковые типы. Любое использование подписанных типов для упаковки подобных значений опасно, особенно если программист привык к Java и не знает правил C.