Are the results of bitwise operations on signed integers defined?

bitwise-operators, c

Solution

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

Problem

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?

Original source