Podczas zmiany wartości,
unsigned char x = ...;
int y = x << 16;
Rodzaj x
jest promowany do int
jeśli unsigned char
pasuje W int
(w większości systemów) lub unsigned
jeśli unsigned char
nie pasuje do int
(rzadko). Tak długo jak twój int
ma szerokość 25 bitów lub więcej, żadne dane nie zostaną odrzucone. .
Należy pamiętać, że jest to całkowicie niezwiązane z tym, że 16
ma typ int
.
/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;
Źródło: z n1516 (projekt C99):
§6.5.7 ustęp 3: Operatorzy przesunięcia bitowego
W promocjach całkowitymi są wykonywane na każdym z argumentów. Typ wyniku to tego z promowanego lewego operandu.
§6.3.1.1 ustęp 2: Boolean, znaków i liczb całkowitych
Jeśli int może reprezentować wszystkie wartości tego samego typu (jak ograniczona przez szerokość, do bitów pola ) , wartość jest konwertowana na int; w przeciwnym razie zostanie przekonwertowany na unsigned int. Są to tak zwane promocje bezpośrednie.
Przypisy:
: Niektóre układy DSP, jak również pewne superkomputery Cray znane są sizeof(char) == sizeof(int)
. Upraszcza to projektowanie jednostki magazynu ładunków procesora kosztem dodatkowego zużycia pamięci.
: Jeśli lewy shift jest promowany do int
a następnie przelewa int
, jest niezdefiniowane zachowanie (demony mogą wylecieć nos).Dla porównania, przepełnienie unsigned
jest zawsze dobrze zdefiniowane, więc przesunięcia bitowe powinny być zwykle wykonywane na typach unsigned
.
Wartość wyrażenia nie jest przypisana. –
Tak jak napisano, kompilator zoptymalizuje operację zmiany, ponieważ nie robi nic. Jaki był prawdziwy kod? –
możesz na to spojrzeć: http://stackoverflow.com/questions/437470/type-to-use-to-represent-a-byte-in-ansi-c89-90-c –