Because the standard says so. The operands to binary operators
undergo integral promotion, in which anything smaller than an
int
is promoted to int
; the results of the operation have
type int
as well. And if the original value were, say,
0x12
, the results would be 0x120
, and assigning this to an
unsigned char
will cause a change in value. (The assigned
value will be 0x20
.) Whence the warning.
EDIT:
From the standard (§5.8 Shift operators): " The operands shall
be of integral or unscoped enumeration type and integral
promotions are performed. The type of the result is that of the
promoted left operand." Unlike other binary operators, there is
no effort to find a common type from the two operators: the
result type is that of the left operand, period. But integral
promotion does still occur: the unsigned char
will be
promoted to int
(or to unsigned int
if int
has a size of
1).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…