...
In this compliant solution, the integer constant -1 is used to set all bits in mask to one. -1 cannot be represented by a variable of type unsigned long. According to the C99 standard, , so -1 is converted to a representable number according to the rule in Section 6.3.1.3, Paragraph 2 of the C99 standard,
Wiki Markup \[If the value can't be represented by the new type and\] if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.
"One more than the maximum value that can be represented in the new type," ULONG_MAX + 1, is added to -1, resulting in a right-hand-side value of ULONG_MAX. The representation of ULONG_MAX is guaranteed to have all bits set to one by Section 6.2.6.1, Paragraph 3,
Values stored in unsigned bit-fields and objects of type
unsigned charshall be represented using a pure binary notation.
(emphasis added)
and by Section 6.2.6.2, Paragraph 1,
For unsigned integer types other than
unsigned char, the bits of the object representation shall be divided into two groups: value bits and padding bits (there need not be any of the latter). If there are N value bits, each bit shall represent a different power of 2 between 1 and 2N ? 1 , so that objects of that type shall be capable of representing values from 0 to 2N ? 1 using a pure binary representation; this shall be known as the value representation. The values of any padding bits are unspecified.
...
By the same reasoning, -1 is suitable for setting all bits to one of any unsigned integer variable. Section 6.2.6.1, Paragraph 3 guarantees the same results for unsigned char,
Values stored in unsigned bit-fields and objects of type
unsigned charshall be represented using a pure binary notation.
(emphasis added)
| Code Block | ||
|---|---|---|
| ||
// (Correct) Set all bits in mask to one.
const unsigned long mask = -1;
unsigned long flipbits(unsigned long x) {
return x ^ mask;
}
|
...