C signed/unsigned

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

C signed/unsigned

Inlägg 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 )
....
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

provat if (a < (long)b) ?

Vad är bitlängd i long respektive int?
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg 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
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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.
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg 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
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Ja, delge det bara inte här... :roll:
Användarvisningsbild
JimmyAndersson
Inlägg: 26566
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

:lol: :lol:

Nä det vore ju förskräckligt. :D
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg 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 )
.......
Skriv svar