maskefjes Skrevet 2. juni 2005 Del Skrevet 2. juni 2005 Har følgende kodesnutt: void main (void) { unsigned int i = 4294967295; printf ("i = %u\n", i); if (i != -1 ) { printf ("i != -1\n"); } else { printf (i == -1\n); } } Output blir: i = 4294967295 i == -1 Vet at det ikke gir så mye mening å sammenlikne en unsigned variabel med et negativt tall, men hvorfor betraktes ikke i som en unsigned i if testen? -/maskefjes Lenke til kommentar
☀ ❄ Skrevet 2. juni 2005 Del Skrevet 2. juni 2005 (endret) Vet at det ikke gir så mye mening å sammenlikne en unsigned variabel med et negativt tall, men hvorfor betraktes ikke i som en unsigned i if testen? Hva mener du? i betraktes i høyeste grad som unsigned i if-setningen. Det er helt gyldig C, så jeg ser ingen grunn til at kompilatoren din skal protestere. For øvrig kommer gcc med en advarsel om du skrur på -Wall: In function `int main()':warning: comparison between signed and unsigned integer expressions Edit: Ah, glem det. Så på utdataene dine. Implisitt konvertering mellom innebygde typer er tillatt. if-setningen finner ut at den binære representasjonen av i og -1 er like, og svarer deretter. Endret 2. juni 2005 av Myubi Lenke til kommentar
maskefjes Skrevet 2. juni 2005 Forfatter Del Skrevet 2. juni 2005 QUOTE (maskefjes @ 02/06/2005 : 11:43) Vet at det ikke gir så mye mening å sammenlikne en unsigned variabel med et negativt tall, men hvorfor betraktes ikke i som en unsigned i if testen? Hva mener du? i betraktes i høyeste grad som unsigned i if-setningen. Jeg mener at å sammenlikne en unsigned variabel (som per definisjon ikke kan være negativ) med et negativt tall ikke har så veldig mye for seg. Så det er med andre ord ikke så mye å gjøre med dette. Det går ikke ann å si at kompilatoren skal se på det ene som unsigned og det andre som signed? -/maskefjes Lenke til kommentar
GeirGrusom Skrevet 2. juni 2005 Del Skrevet 2. juni 2005 For datamaskinen er det ingenting som heter unsigned eller signed int, eller rettere sagt, den ser ikke forskjell, dette må brukeren fortelle, for det eneste datatypene maskinen takler er 8, 16, 32 og 64 (og 128 og 256 bit for SSE/SSE2) for flyttall er det 32, 64 og 80 bit. Så hvis du tar en unsigned regneoperasjon på et tall som er signed, vil ikke det være feil, men du kan oppnå feil resultat, C og C++ går utifra at programmereren vet hva han driver med, i motsetning til f.eks. Visual Basic eller C# eller noe slikt, hvor dette vill gitt deg en feil. Lenke til kommentar
Mantion Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 void main (void) { unsigned int i = 4294967295; printf ("i = %u\n", i); if (i != -1 ) { printf ("i != -1\n"); } else { printf (i == -1\n); <-- Ser du noe feil her? Kanskje du glemte noen """"""""? } } Lenke til kommentar
maskefjes Skrevet 3. juni 2005 Forfatter Del Skrevet 3. juni 2005 Har nok glemt dobbelt fnutter, men det ernok ikke det som er feilen. Dette er ikke den koden som er kompilert inn siden den befinner seg på en annen maskin...... Så problemet er nok ikke så enkelt. Lenke til kommentar
zyp Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 Det er ikke kompilatoren som gjør sammenligninga, det er prosessoren som kjører maskinkoden. Alt kompilatoren kan gjøre er å gi deg en advarsel eller en feilmelding. Prosessoren sammenligner bare den binære representasjonen av 4294967295 og -1, som begge er 0xffffffff. Merk at dette gjelder 32-bits systemer. Om du hadde kjørt denne koden på et 64-bits system så hadde det blitt annerledes, for der representeres -1 som 0xffffffffffffffff, men de samme reglene gjelder der, bare at der er -1 lik 18446744073709551615. Skjønner ikke hvorfor du ser på dette som et problem, bare unngå å sammenligne signed og unsigned. Lenke til kommentar
drall Skrevet 3. juni 2005 Del Skrevet 3. juni 2005 There are 10 types of people in this world, those who understand binary and those who don't. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå