waarschuwing: aantal shifts links >= breedte van type

Ik ben erg nieuw in het omgaan met bits en ben tijdens het compileren vastgelopen op de volgende waarschuwing:

7: warning: left shift count >= width of type

Mijn regel 7 ziet er zo uit

unsigned long int x = 1 << 32;

Dit zou logisch zijn als de grootte van longop mijn systeem 32 bits was. sizeof(long)retourneert echter 8en CHAR_BITwordt gedefinieerd als 8wat suggereert dat lang 8×8 = 64 moet zijn beetjes lang.

Wat mis ik hier? Zijn sizeofen CHAR_BITonjuist of heb ik iets fundamenteels verkeerd begrepen?


Antwoord 1, autoriteit 100%

longkan een 64-bits type zijn, maar 1is nog steeds een int. Je moet van 1een long intmaken met het achtervoegsel L:

unsigned long x = 1UL << 32;

(Je moet het ook unsignedmaken met het achtervoegsel U, zoals ik heb laten zien, om de problemen van het naar links verschuiven van een ondertekend geheel getal te voorkomen. Er is geen probleem wanneer een longis 64 bits breed en je verschuift met 32 ​​bits, maar het zou een probleem zijn als je 63 bits zou verschuiven)


Antwoord 2, autoriteit 18%

unsigned longis 32 bit of 64 bit, afhankelijk van uw systeem. unsigned long longis altijd 64 bit. Je moet het als volgt doen:

unsigned long long x = 1ULL << 32

Antwoord 3, autoriteit 2%

De geaccepteerde oplossing is prima voor [constant]ULL<<32 maar niet goed voor bestaande variabelen – b.v. [variabel]<<32. De complete oplossing voor variabelen is:
((unsigned long long)[variabele]<<32). Terzijde: mijn persoonlijke mening over deze waarschuwing is dat het in de eerste plaats helemaal niet nodig is. De compiler kan zien wat het ontvangende gegevenstype is en kent de breedte van de parameters uit de definities in headers of constante waarden. Ik geloof dat Apple de clang-compiler iets intelligenter zou kunnen maken dan het is met betrekking tot deze waarschuwing.


Antwoord 4

unsigned long x = 1UL << 31;

De foutmelding niet weergeven. Omdat voordat u de 32 opgeeft, niet waar is omdat alleen beperkt tot 0-31.


Antwoord 5

Je kunt een waarde niet verschuiven naar het maximale bit

int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 

Dus dit genereert de waarschuwing

left shift count >= width of type (i.e type = int = 32 )


Antwoord 6

Je kunt zoiets gebruiken:

unsigned long x = 1;
x = x << 32;

Other episodes