Unsigned wraparound in Turbo C (DOS): what does this program print?
#include
typedef unsigned long int uli;
typedef uli u;
int main()
{
uli a;
u b = (u)-1;
a = (uli)-1;
printf("%lu, %lu", a, b);
return 0;
}
-
A4343445454, 4343445454
-
B4545455434, 4545455434
-
C4294967295, 4294967295
-
DGarbage values
Answer
Correct Answer: 4294967295, 4294967295
Explanation
Introduction / Context:This checks knowledge of unsigned wraparound and typical widths under Turbo C. Casting -1 to an unsigned type yields the maximum representable value for that type.
Given Data / Assumptions:
- In 16-bit Turbo C, unsigned long is 32-bit.
- printf with %lu expects unsigned long.
- Both a and b are unsigned long values assigned -1 after casting.
Concept / Approach:Two's complement and modulo arithmetic: (unsigned long)-1 maps to 2^32 - 1 = 4294967295.
Step-by-Step Solution:1) a = (unsigned long)-1 ⇒ 4294967295.2) b = (unsigned long)-1 via typedef u ⇒ 4294967295.3) Printing both yields "4294967295, 4294967295".
Verification / Alternative check:Print sizeof(unsigned long) to confirm 4, then print the values.
Why Other Options Are Wrong:Options A/B are arbitrary numbers; Option D is incorrect because defined unsigned wraparound is not garbage.
Common Pitfalls:Using a wrong format specifier (e.g., %u) or assuming 64-bit widths on modern systems; this is specific to Turbo C.
Final Answer:4294967295, 4294967295