I know that the behavior of >> on signed integer can be implementation dependent (specifically, when the left operand is negative).
What about the others: ~, >>, &, ^, |?
When their operands are signed integers of built-in type (short, int, long, long long), are the results guaranteed to be the same (in terms of bit content) as if their type is unsigned?
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…