9 svar
103 visningar
paprika_22 behöver inte mer hjälp
paprika_22 60
Postad: 9 aug 14:51

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. 

Laguna Online 30711
Postad: 9 aug 15:18

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.

Laguna Online 30711
Postad: 9 aug 15:26

u:s första värde spelar förstäs ingen roll alls.

paprika_22 60
Postad: 9 aug 15:27
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.

Laguna Online 30711
Postad: 9 aug 15:35
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:

paprika_22 60
Postad: 9 aug 17:20
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.

anders_k 237
Postad: 12 aug 07:10

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. 

Svara
Close