-
November 5th, 2012, 10:31 AM
#1
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;
-
November 5th, 2012, 10:55 AM
#2
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.
-
November 5th, 2012, 11:01 AM
#3
Re: dereferencing char pointers
thanks.
in that case, char should be unsigned by default, imo.
-
November 5th, 2012, 11:38 AM
#4
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...
-
November 6th, 2012, 12:19 PM
#5
Re: dereferencing char pointers
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.
Cheers, D Drmmr
Please put [code][/code] tags around your code to preserve indentation and make it more readable.
As long as man ascribes to himself what is merely a posibility, he will not work for the attainment of it. - P. D. Ouspensky
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|