Although many common implementations use a two's complement representation of signed integers, the C Standard declares such use as implementation-defined and allows all of the following representations:
- Sign and magnitude
- Two's complement
- One's complement
This is a specific example of MSC14-C. Do not introduce unnecessary platform dependencies.
Noncompliant Code Example
One way to check whether a number is even or odd is to examine the least significant bit, but the results will be inconsistent. Specifically, this example gives unexpected behavior on all one's complement implementations:
The same thing can be achieved compliantly using the modulo operator:
Using bitwise operators is safe on unsigned integers:
Incorrect assumptions about integer representation can lead to execution of unintended code branches and other unexpected behavior.
DF2941, DF2942, DF2943, DF2946, DF2947, DF2948
|LDRA tool suite
|50 S, 120 S
|Bitwise operators shall only be applied to operands of unsigned underlying type
502, 2704, 9088
Partially supported: reports bitwise not of signed quantity, declaration of named signed single-bit bitfields, and negation of the minimum negative integer