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 long
op mijn systeem 32 bits was. sizeof(long)
retourneert echter 8
en CHAR_BIT
wordt gedefinieerd als 8
wat suggereert dat lang 8×8 = 64 moet zijn beetjes lang.
Wat mis ik hier? Zijn sizeof
en CHAR_BIT
onjuist of heb ik iets fundamenteels verkeerd begrepen?
Antwoord 1, autoriteit 100%
long
kan een 64-bits type zijn, maar 1
is nog steeds een int
. Je moet van 1
een long int
maken met het achtervoegsel L
:
unsigned long x = 1UL << 32;
(Je moet het ook unsigned
maken 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 long
is 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 long
is 32 bit of 64 bit, afhankelijk van uw systeem. unsigned long long
is 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;