A bit field can be signed or unsigned. According to the C++ standard, a signed bit field may be represented in one of three ways:
- two’s complement
- one’s complement
- sign bit
In practice, most modern architectures use two’s complement. On such systems, a signed bit field of two bits can safely hold the values -2, -1, 0, 1, 2. However, on implementations that use a sign bit, a signed bit field of two bits can hold the values -1, 0, 1.
struct BITS { signed char a: 2; //range: -1,0 1 or -2,-1,0,1,2 depending on platform unsigned signed char b: 1; // possible values: 0,1 };
If you’re using signed bit fields in your apps, check how the target platform represents signed bit fields to avoid rollover bugs.