Given unsigned char i = 0x80 in C, what decimal value is printed?
#include
int main()
{
unsigned char i = 0x80; // 128
printf("%d
", i << 1);
return 0;
}
Assume usual integer promotions apply before the shift.
-
A0
-
B256
-
C100
-
D80
-
ENone of the above
Answer
Correct Answer: 256
Explanation
Introduction / Context:This item checks knowledge of the “usual integer promotions” and how bit shifts are performed in C when the operand is smaller than int. An unsigned char is promoted to int before shifting.
Given Data / Assumptions:
- i = 0x80 (hex) = 128 (decimal).
- Left shift by 1 bit → multiply by 2 when no overflow in promoted type.
- printf uses %d, so it prints the decimal form of the resulting int.
Concept / Approach:Before evaluating i << 1, i is promoted to int. Thus the operation is 128 << 1 as an int, yielding 256 without truncation during the operation. The result is then passed to printf and printed as a decimal integer.
Step-by-Step Solution:unsigned char i = 128.Promote: (int)128 << 1 → 256.printf("%d") outputs 256.
Verification / Alternative check:If you had stored the result back into an unsigned char (e.g., i = i << 1), it would wrap modulo 256 and become 0; but the code prints the promoted result directly.
Why Other Options Are Wrong:0: would occur only if storing back into 8 bits.100 / 80: unrelated decimal values.
Common Pitfalls:Forgetting promotions; assuming 8-bit wrap happens during the shift expression itself.
Final Answer:256