hvad gør og 0hff?

Anding et heltal med 0xFF efterlader kun den mindst signifikante byte. For eksempel for at få den første byte i en short s, kan du skrive s & 0xFF. Dette kaldes typisk “maskering”. Hvis byte1 enten er en enkelt byte-type (som uint8_t) eller allerede er mindre end 256 (og som et resultat er alle nuller undtagen den mindst signifikante byte), er der ikke behov for at maskere de højere bits, da de allerede er nul.

se tristopiaPatrick Schlrister svar nedenfor, når du kan arbejde med signerede typer. Når jeg udfører bitvise operationer, anbefaler jeg kun at arbejde med usignerede typer.

hvis byte1 er en 8-bit heltalstype, er det meningsløst-hvis det er mere end 8 bit, vil det i det væsentlige give dig de sidste 8 bit af værdien:

 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 & 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ------------------------------- 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1

faren for det andet udtryk kommer, hvis typen byte1 er char. I så fald kan nogle implementeringer have det signed char, hvilket vil resultere i tegnudvidelse ved evaluering.

signed char byte1 = 0x80;signed char byte2 = 0x10;unsigned short value1 = ((byte2 << 8) | (byte1 & 0xFF));unsigned short value2 = ((byte2 << 8) | byte1);printf("value1=%hu %hx\n", value1, value1);printf("value2=%hu %hx\n", value2, value2);

vil udskrive

value1=4224 1080 rightvalue2=65408 ff80 wrong!!

jeg prøvede det på gcc v3.4.6 på Solaris SPARC 64 bit, og resultatet er det samme med byte1 og byte2 erklæret som char.

TL;DR

maskeringen er at undgå implicit tegnforlængelse.

Rediger: jeg kontrollerede, det er den samme adfærd i C++.

EDIT2: som anmodet forklaring af tegn udvidelse.Tegnudvidelse er en konsekvens af den måde, C evaluerer udtryk på. Der er en regel i C kaldet forfremmelsesregel. C vil implicit kaste alle små typer til int, før du foretager evalueringen. Lad os se, hvad der sker med vores udtryk:

unsigned short value2 = ((byte2 << 8) | byte1);

byte1 er en variabel indeholdende bit mønster 0. Hvis char er unsigned denne værdi fortolkes som 255, hvis den er signed er den -128. Når beregningen udføres, vil C udvide værdien til en int størrelse (16 eller 32 bit generelt). Det betyder, at hvis variablen er unsigned og vi vil holde værdien 255, vil bitmønsteret for den værdi som int være 0h000000ff. Hvis det er signed, vil vi have værdien -128, hvilket bitmønster er 0. Tegnet blev udvidet til størrelsen af tempory bruges til at gøre beregningen.Og således oring den midlertidige vil give det forkerte resultat.

på 86 samling er det gjort medmovsx instruktionen (movzx for nuludvidelsen). Andre CPU ‘ er havde andre instruktioner til det (6809 havde SEX).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.