dereferencing char pointers
hi,
why doesnt the following program work as expected:
Code:
char x = 0xff;
char* y = &x;
if(*y == 0xff)
{
return 1;
}
return 0;
imo, it should return "1", but it doesnt. It seems like instead of comparing 0xff == 0xff, the compiler compares 0xffffffff == 0xff. Why?
If i use "byte" for this example, everything works as expected, even though it`s just defined as an "unsigned char".
Code:
typedef unsigned char byte;
Re: dereferencing char pointers
because char, signed char and unsigned char are different types and it's implementation defined whether char is signed or not. More specifically, the integer literal 0xff has type int, which is converted to char that, being signed in your compiler implementation, acquires the integer value -1. Then, in the expression "*y==0xff" where you're comparing a char and an int, integer promotion rules kick in and the char is converted to the int -1, giving the observed result.
Re: dereferencing char pointers
thanks.
in that case, char should be unsigned by default, imo.
Re: dereferencing char pointers
That would be handy in some cases but also quite confusing since the other integers (short, int...) are signed. There are a lot of pitfalls in C/C++ and integer promotion will create nasty surprises for you in many other cases as well. It's just to get used to it... :)
Re: dereferencing char pointers
Quote:
Originally Posted by
tuli
why doesnt the following program work as expected:
Two guidelines that can help to prevent these kinds of errors are:
- Don't use magic numbers. If you use a const variable for the value 0xff, you make the type of that variable explicit.
- Don't mix signed and unsigned arithmetics. Signed values will get promoted to unsigned, which can cause unexpected results.