Type
Promotion
Type
Promotion occurs when a lower-ranked type is automatically converted to a
higher-ranked type to perform operations. This helps in maintaining precision
and avoiding data loss. The C++ type promotion hierarchy generally follows this
order:
1. bool
(lowest)
2. char`,
`short (integral types)
3. int
4.
unsigned int
5. long
6.
unsigned long
7. long
long
8.
unsigned long long
9. float
10. double
11. long
double (highest)
Examples
of Type Promotion:
-
Arithmetic Operations:
Example:
int a = 5;
double b = 4.2;
double result = a + b; // 'a' is promoted to
double
Here, `int` is promoted to `double` to match
the type of `b`.
- Mixed
Type Operations:
short x = 10;
long y = 20;
long result = x + y; // 'x' is promoted to
long
Promotion
Rules:
1.
Arithmetic Conversions: When performing arithmetic operations between different
types, the lower type is promoted to the higher type.
2.
Function Arguments: When passing arguments to functions, if the function
expects a type larger than the provided argument, the argument is promoted.
Type
Demotion
Type
Demotion (or Type Downcasting) involves converting a higher-ranked type to a
lower-ranked type. This may lead to data loss or precision issues, and is
generally performed explicitly by the programmer.
Examples
of Type Demotion:
-
Explicit Casting:
double d = 3.14;
int i = static_cast<int>(d); //
Explicitly cast 'double' to 'int'
Here, `d` is demoted to `int`, which
truncates the fractional part.
-Example:
long long ll = 123456789012345LL;
int i = ll; // Implicit demotion, possible
loss of data
Demotion
Considerations:
1. Data
Loss: When demoting from a larger type to a smaller type, you may lose
information.
2. Precision
Issues: Demoting from `double` to `float` or `int` can lead to loss of
precision.
Using C++
Casts:
-
static_cast`: Used for non-polymorphic conversions (e.g., numeric conversions).
-
dynamic_cast`: Used for safe downcasting in polymorphic class hierarchies.
-
const_cast`: Used to add or remove `const` from variables.
-
reinterpret_cast`: Used for low-level casting, often unsafe.
Example of
`static_cast`:
float f =
3.5f;
int i =
static_cast<int>(f); // Truncates the decimal part
Understanding
type promotion and demotion is crucial for writing correct and efficient C++
code, especially in complex arithmetic and data processing tasks.
No comments:
Post a Comment