Jämförelse int med unsigned int
Det jag undrar är varför jag får resultatet "Larger!!" vid jämförelse? Jag skapar först en unsigned int u = -8, men eftersom en unsigned int per definition inte får vara negativ så får den värdet 2^32 - 8. Sen ger jag u värdet 0, samt skapar int i = -8.
Eventuellt får man en ledtråd om man slår på alla varningar.
Precis som Laguna säger, slå på varningar. Då lär du se "sign-compare" som varnar för jämförelse mellan signed/unsigned.
Det som sker under huven är att din int castas till unsigned int, vilket som du redan konstaterat gör den mycket större än 0.
u:s första värde spelar förstäs ingen roll alls.
Laguna skrev:u:s första värde spelar förstäs ingen roll alls.
Tack för svar! Det förstår jag, men det är alltså att int konverteras som gör att i blir större
paprika_22 skrev:Laguna skrev:u:s första värde spelar förstäs ingen roll alls.
Tack för svar! Det förstår jag, men det är alltså att int konverteras som gör att i blir större
Stämmer, vid jämförelsen måste de vara samma typ. Det är därför varningar är dina vänner. Slå på dem, så får du massa bra synpunkter på din kod.
paprika_22 skrev:Laguna skrev:u:s första värde spelar förstäs ingen roll alls.
Tack för svar! Det förstår jag, men det är alltså att int konverteras som gör att i blir större
Kolla om det är lika den blir, eller större.
Den här koden:
#include <iostream>
int main() {
unsigned int u=0;
int i=-8;
if (i<u) {
std::cout << "Smaller\n";
}
else {
std::cout << "Same or Larger\n";
}
return 0;
}
... genererar följande varning med gcc -Wsign-compare:
sictransit skrev:paprika_22 skrev:Laguna skrev:u:s första värde spelar förstäs ingen roll alls.
Tack för svar! Det förstår jag, men det är alltså att int konverteras som gör att i blir större
Stämmer, vid jämförelsen måste de vara samma typ. Det är därför varningar är dina vänner. Slå på dem, så får du massa bra synpunkter på din kod.
En kommentar : anledningen till att kompilatorn varnar för detta (när man slår på det) är att det kan skapa svårt-att-hitta buggar när man får för sig att jämföra uint med int, speciellt i uttryck som involverar addition och subtraktion t.ex.
uint d = 2;
int f = 3;
int g=2;
if (d - f < g ) { ... } // detta kommer aldrig bli sant
Att man måste explicit slå på varningen är nog av historiska skäl.