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... :roll:

Postat: 30 augusti 2007, 23:01:12
av JimmyAndersson
:lol: :lol:

Nä det vore ju förskräckligt. :D

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 )
.......