Conversions from Signed Integral Types
When a signed integer is converted to an unsigned integer with equal or greater size and the value of the signed integer is not negative, the value is unchanged. The conversion is made by sign-extending the signed integer. A signed integer is converted to a shorter signed integer by truncating the high-order bits. The result is interpreted as an unsigned value, as shown in this example.
int i = -3; unsigned short u; u = i; printf_s( "%hu\n", u ); // Prints 65533
No information is lost when a signed integer is converted to a floating value, except that some precision may be lost when a long int or unsigned long int value is converted to a float value.
The following table summarizes conversions from signed integral types. This table assumes that the char type is signed by default. If you use a compile-time option to change the default for the char type to unsigned, the conversions given in the Conversions from Unsigned Integral Types table for the unsigned char type apply instead of the conversions in the following table, Conversions from Signed Integral Types.
Conversions from Signed Integral Types
From | To | Method |
---|---|---|
char1 | short | Sign-extend |
char | long | Sign-extend |
char | unsigned char | Preserve pattern; high-order bit loses function as sign bit |
char | unsigned short | Sign-extend to short; convert short to unsigned short |
char | unsigned long | Sign-extend to long; convert long to unsigned long |
char | float | Sign-extend to long; convert long to float |
char | double | Sign-extend to long; convert long to double |
char | long double | Sign-extend to long; convert long to double |
short | char | Preserve low-order byte |
short | long | Sign-extend |
short | unsigned char | Preserve low-order byte |
short | unsigned short | Preserve bit pattern; high-order bit loses function as sign bit |
short | unsigned long | Sign-extend to long; convert long to unsigned long |
short | float | Sign-extend to long; convert long to float |
short | double | Sign-extend to long; convert long to double |
short | long double | Sign-extend to long; convert long to double |
long | char | Preserve low-order byte |
long | short | Preserve low-order word |
long | unsigned char | Preserve low-order byte |
long | unsigned short | Preserve low-order word |
long | unsigned long | Preserve bit pattern; high-order bit loses function as sign bit |
long | float | Represent as float. If long cannot be represented exactly, some precision is lost. |
long | double | Represent as double. If long cannot be represented exactly as a double, some precision is lost. |
long | long double | Represent as double. If long cannot be represented exactly as a double, some precision is lost. |
1. All char entries assume that the char type is signed by default.
Microsoft Specific
For the Microsoft 32-bit C compiler, an integer is equivalent to a long. Conversion of an int value proceeds the same as for a long.
END Microsoft Specific