#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.