05 Type Conversion Mechanisms
1. The Nature of Conversion
In C, type conversion (casting) is rarely just a logical relabeling. It almost always involves CPU instructions and physical memory reorganization. It is the process of translating data from one storage format (contract) to another.
A. Implicit Conversion (Automatic)
- Definition: Performed automatically by the compiler without programmer intervention.
- Philosophy: Tends to be "Upward Compatible" (widening) to prevent data loss, but can be aggressive.
- Triggers:
- Assignments:
double d = 10;(Int \(\to\) Double). - Arithmetic:
10 + 3.14(Int promoted to Double). - Function Calls: Passing arguments that do not strictly match parameters.
- Assignments:
B. Explicit Conversion (Casting)
- Definition: Forced by the programmer using the
(type)operator. - Philosophy: "The programmer knows best." The compiler will execute the command even if it results in data loss or nonsense values.
- Syntax:
(type_name) expression.
2. Physical Mechanisms: What Happens in Hardware
Conversion triggers one of four distinct physical actions in the CPU.
A. Upgrading: Extension (Small \(\to\) Big)
When moving a smaller integer to a larger container, the new high-order bits must be filled.
1. Zero Extension (for Unsigned Types):
* Action: Fills all new high bits with 0.
* Result: The numerical value remains identical.
* Example: unsigned char (0xFF) \(\to\) int (0x000000FF).
2. Sign Extension (for Signed Types):
* Action: Fills all new high bits with a copy of the Sign Bit (MSB).
* Result: Preserves the Two's Complement value (negative remains negative).
* Example: signed char (-5, 0xFB) \(\to\) int (-5, 0xFFFFFFFB).
B. Downgrading: Truncation (Big \(\to\) Small)
- Action: The CPU physically discards the high-order bits. Only the lower bits matching the target size are kept.
- Mathematical Equivalent: \(Result = Value \pmod{2^N}\) (where N is the target bit width).
- Result: Potential massive change in value and sign.
- Example:
int300 (0x012C) \(\to\)char(0x2C = 44).
- Example:
C. Re-encoding (Integer \(\leftrightarrow\) Float)
- Action: The bits are completely reshuffled and translated. This is not a simple copy or cut.
- Int \(\to\) Float: The CPU calculates the Sign, Exponent, and Mantissa fields to approximate the integer.
- Float \(\to\) Int: The CPU extracts the Mantissa, shifts based on the Exponent, and truncates the fractional part (Round toward Zero).
D. Re-interpretation (Pointer Casting)
- Action: No physical bit change occurs.
- Concept: The strict "Lens" is swapped. The compiler is told to look at the same raw memory bits through a different logic.
- Example:
float f = 3.14; int *p = (int*)&f; - Result: Reading
*pyields a nonsensical integer value because the IEEE 754 bits are being interpreted as Two's Complement.
3. The Three Major Conversion Risks
A. Precision Loss
- Scenario: Converting
long long(64-bit) todouble(53-bit effective mantissa). - Mechanism: The integer requires 64 bits of precision, but the
doublecan only store the most significant 53 bits. The lowest bits are silently rounded off. - Result:
9000000000000000001becomes9000000000000000000.
B. The Signed/Unsigned Mismatch Trap
- Rule: When a Signed Integer and an Unsigned Integer are compared or operated on, the Signed Integer is implicitly converted to Unsigned.
- Mechanism: A negative number (e.g., -1) has its bits re-interpreted as a massive positive number (e.g.,
0xFFFFFFFF\(\approx\) 4.2 Billion). - Result:
if (-1 > 10U)evaluates to True.
C. Silent Overflow Truncation
- Scenario: Assigning the result of an arithmetic operation to a smaller type.
- Mechanism: The calculation usually happens in
int(due to promotion), but the assignment triggers instant truncation. - Result:
c unsigned char a = 200, b = 100; unsigned char c = a + b; // Result is 44, not 300The overflow bit (256) is lost during the assignment toc.