Sida 1 av 1
C signed/unsigned
Postat: 30 augusti 2007, 21:45:10
av pheer
Jag har följande delikata situation. Oavsett hur jag castar får jag inte
villkoret att bli sant. Vad kan felet/problemet vara? Kompilatorn är Microchips C30 (=gcc).
Kod: Markera allt
signed long a = -1;
unsigned int b = 0;
if ( a < b )
....
Postat: 30 augusti 2007, 22:14:24
av speakman
provat if (a < (long)b) ?
Vad är bitlängd i long respektive int?
Postat: 30 augusti 2007, 22:23:08
av pheer
Faktiskt inte, men den fungerade inte. 32 och 16 bitar.
Har provat
a < (unsigned long) b
a < (signed int) b
a < (signed long) b
a < (long) b
Postat: 30 augusti 2007, 22:27:11
av speakman
Funkar inte ovanstående så är det kompilatorbugg.
Du kan ju kolla den genererade ASM-koden och se hur den gör egentligen.
Varför måste du blanda 32 och 16 bit?
Och även jämföra dom?
Prova gör en ny long-variabel och sätt värdet på den från b:
long tmp = (long)b;
Kolla vilket värde "tmp" fick.
Postat: 30 augusti 2007, 22:45:00
av pheer
Varför måste du blanda 32 och 16 bit?
Bra fråga, nu kom jag på en annan bättre lösning.
Grundproblemet är dock fortfarande oläst. Men det får vi brottas med en annan gång
Postat: 30 augusti 2007, 22:58:24
av speakman
Ja, delge det bara inte här...

Postat: 30 augusti 2007, 23:01:12
av JimmyAndersson
Postat: 5 september 2007, 19:24:30
av BoF
Typ konvertera om b till signed i villkors testen, så bör det fungera.
Kod: Markera allt
signed long a = -1;
unsigned int b = 0;
if ( a < (signed)b )
.......