For negative operands, <<
has undefined behavior and the result of >>
is implementation-defined (usually as "arithmetic" right shift). <<
and >>
are conceptually not bitwise operators. They're arithmetic operators equivalent to multiplication or division by the appropriate power of two for the operands on which they're well-defined.
As for the genuine bitwise operators ^
, ~
, |
, and &
, they operate on the bit representation of the value in the (possibly promoted) type of the operand. Their results are well-defined for each possible choice of signed representation (twos complement, ones complement, or sign-magnitude) but in the latter two cases it's possible that the result will be a trap representation if the implementation treats the "negative zero" representation as a trap. Personally, I almost always use unsigned expressions with bitwise operators so that the result is 100% well-defined in terms of values rather than representations.
Finally, note that this answer as written may only apply to C. C and C++ are very different languages and while I don't know C++ well, I understand it may differ in some of these areas from C...
>>
is usually implemented arithmetic right shift (correctly / 2 number) if signed, and logical right shift (fill with zero) if unsigned.<<
also doesn't have any confusion, since we will just remove the bit on the left (and fill with zero on the right). – Nominee<<
rather than>>
in your list of "other" operators? – Tillich