Reasoning about left shifts: Is left-shifting an integer by 1 always equivalent to multiplying it by 2 in C?\nAnswer considering overflow and signedness rules.

Difficulty: Easy

Correct Answer: False

Explanation:


Introduction / Context:
This concept check addresses the common heuristic that a left shift by 1 “multiplies by 2.” While often true for non-overflowing unsigned arithmetic, it is not universally valid in C because of overflow and signedness concerns.



Given Data / Assumptions:

  • C integer arithmetic can overflow.
  • Signed overflow is undefined behavior.
  • Unsigned arithmetic wraps modulo 2^n.


Concept / Approach:
For values where 2x fits in range and where the type is unsigned (or where behavior is defined), x << 1 equals x * 2. But if the shift discards significant bits (overflow) or if x is signed and the shift produces a negative or undefined state, the equivalence fails.



Step-by-Step Solution:
Consider unsigned 8-bit 200: 200 << 1 = 400 mod 256 = 144, not 400.Consider signed int near INT_MAX: shifting left by 1 can overflow → undefined behavior, not equal to 2x.Therefore, “always equivalent” is false.



Verification / Alternative check:
Compare x<<1 and x*2 across boundary cases in a small program for unsigned vs. signed types; you will observe differences at extremes.



Why Other Options Are Wrong:
True: ignores overflow and undefined behavior.



Common Pitfalls:
Overgeneralizing bit tricks; not distinguishing signed from unsigned; forgetting about modulo wrap for unsigned.



Final Answer:
False

Discussion & Comments

No comments yet. Be the first to comment!
Join Discussion