Using the == operator to compare a char to 0x80 always results in false?
binary, byte, c++, char, types
Solution
The problem is that `char` is, in the C and C++ standards, defined that it can be either a signed or an unsigned value, and that a `char` must have at least 8 bits. The architecture and compiler in question appears to use signed 8-bit `char` values.
This means that any value with the highest bit (bit 7) will be a negative value. So 0x80 as a `char` becomes -128 decimal.
The constant 0x80 is not a `char` value, it is an `int` value.
So when you compare -128 with 0x80 (128) they are not the same, and can never be, and the compiler figures this out and issues a warning.
There are a variety of ways to achieve this, here are a few possible scenarios:
First, we can cast either value to the type of the other:
if (((int)byte) & 0xff == 0x80)
or
if (byte == (char)0x80)
Alternatively, we can make the constant into a `char` value, rather than an `int` value.
if (byte == '\200') // Octal 200 = 0x80.
or
if (byte == '\x80')
Alternatively, use an `unsigned char byte = 0x80;` - specifying that it's an unsigned char will ensure that it doesn't "flip to negative".
Problem
``` char byte = 0x80 if(byte == 0x80) { cout << "This message never gets printed!"; } ``` The hexadecimal value `0x80` is equivalent in binary to `1000 0000`, which clearly fits in a byte. However, the compiler warns me about the line with the conditional: ``` warning: comparison is always false due to limited range of data type ``` Why is the result of the conditional false in this case? Is `0x80` getting expanded in the conditional to something like `0x80000000`? Is it possible to use the `==` operator to check if a `char` equals `0x80`?