Несколько ответов здесь утверждают, что если int
имеет ширину 16 битов, 0xFFFF
является отрицательным. Это неправда. 0xFFFF
никогда не бывает отрицательным.
Шестнадцатеричный литерал представлен первым из следующих типов, достаточно больших, чтобы его содержать: int
, unsigned int
, long
и unsigned long
.
Если int
имеет ширину 16 битов, то 0xFFFF
больше максимального значения, представляемого int
. Таким образом, 0xFFFF
имеет тип unsigned int
, который гарантированно будет достаточно большим, чтобы представлять 0xFFFF
.
Когда обычные арифметические преобразования выполняются для оценки &
, unsigned int
преобразуется в long
. Преобразование 16-разрядного unsigned int
в long
четко определено, поскольку каждое значение, представляемое 16-разрядным unsigned int
, также представляется 32-разрядным long
.
Расширение знака не требуется, поскольку начальный тип не подписан, а результат использования 0xFFFF
совпадает с результатом использования 0xFFFFL
.
В качестве альтернативы, если int
шире, чем 16 бит, тогда 0xFFFF
имеет тип int
. Это подписанное, но положительное число. В этом случае оба операнда подписаны, и long
имеет больший ранг преобразования, поэтому int
снова повышается до long
обычными арифметическими преобразованиями.
Как уже говорили другие, вам следует избегать побитовых операций со знаковыми операндами, потому что числовой результат зависит от того, как представляется подпись.
Кроме этого, в этом коде нет ничего особенно плохого. Я бы сказал, что это проблема стиля, что value
не инициализируется при объявлении, но это, вероятно, комментарий уровня нит-пика и зависит от содержимого пропущенного раздела //some stuff
.
Вероятно, также предпочтительнее использовать целочисленный тип фиксированной ширины (например, uint32_t
) вместо long
для большей переносимости, но на самом деле это также зависит от кода, который вы пишете, и ваших основных предположений.