C: Förvirring om vänsterskiftning

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

C: Förvirring om vänsterskiftning

Inlägg av Zkronk »

Hej!

Jag har råkat ut för en kodsnutt som jag inte förstår varför den fungerar som den gör.
Vänsterskiftar jag en 8-bitars variabel 8 steg borde väl den bli 0b00000000?
Hade jag type-castat value till en uint16_t innan jag gjorde vänsterskiftningen hade jag förväntat mig resultatet jag får nu däremot.

Kod: Markera allt

#include <stdint.h>

int main(void)
{
    uint8_t value = 0b10101111;
    uint16_t storage = value << 8;

    // storage har nu värdet 0b1010111100000000 enligt debuggern.

    return 0;
}
Användarvisningsbild
bit96
Inlägg: 2492
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: C: Förvirring om vänsterskiftning

Inlägg av bit96 »

Vid beräkningar omvandlas värdena alltid(?) till minst 'int'.
Jag minns inte de exakta reglerna nu, men kolla upp begreppen typomvandling och heltalsutvidgning.

Som vanligt är det i C definierat exakt som händer.
Observera att det ibland kan var definierat till att vara odefinierat. :)
Sen är det upp till tillverkarna av kompilatorn att välja vilka regler man vill följa och inte.

Du bör alltså själv type-casta och maska så det blir exakt som du vill när man håller på med bit-manipulering.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: C: Förvirring om vänsterskiftning

Inlägg av Zkronk »

Tack!

Det verkar heta integer promotion på engelska?
Skriv svar