|
From: | Dave N6NZ |
Subject: | Re: [avr-gcc-list] Warning message |
Date: | Tue, 02 Oct 2007 23:25:30 -0700 |
User-agent: | Thunderbird 1.5 (X11/20051201) |
Royce Pereira wrote:
I believe what is going on is the C standard requires promotion to int, and that bites (bytes?) you :)Hi all, What does the following warning mean? warning: comparison is always true due to limited range of data type Here is the context: I have a AVR I'm trying to connect to a DS1307 RTC chip via TWI. To check the integrity of the DS1307 internal ram, I plan to write 4 bytes, 0x55,0xaa,0x55,0xaa in the 1st 4 loations, & read them back & verify, whenever I power up. My code contains this: #define CHK_1307 0x55 uint8 twi_read(void) { //.......... return TWDR; } //----------------------- uint8_t init_1307(void) { uint8_t ok = 1 ; if(twi_read() != CHK_1307) ok= 0; if(twi_read() != ~CHK_1307) ok= 0; // ^^^^^^ // The offending line.
The result of twi_read() and also the ~CHK_1307 get promoted to ints before comparison. So... 0x00xx from twi_read() is compared against -xFFAA, which is clearly always true.
Check the generated code. Casting to uint8_t in the comparison may get you what you want, but check the code, don't take my word for it.
-dave
return ok; } //-------------------------- Thanks, --Royce.
[Prev in Thread] | Current Thread | [Next in Thread] |