Conversions from signed integral types
When a signed integer is converted to an integer or a floating-point type, the value is unchanged if it's representable in the result type.
When a signed integer is converted to an integer of greater size, the value is sign-extended. When converted to an integer of smaller size, the high-order bits are truncated. The result is interpreted using the result type, as shown in this example:
int i = -3;
unsigned short u;
u = i;
printf_s( "%hu\n", u ); // Prints 65533
When the compiler converts a signed integer to a floating-point type, if the original value isn't representable exactly in the result type, the result is the next higher or lower representable value.
For information about the sizes of integral and floating-point types, see Storage of basic types.
The following table summarizes conversions from signed integral types. It assumes 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 this table.
Microsoft Specific
In the Microsoft compiler, int
and long
are distinct but equivalent types. Conversion of an int
value proceeds in the same way as conversion of a long
.
END Microsoft Specific
Table of conversions from signed integral types
From | To | Method |
---|---|---|
char 1 |
short |
Sign-extend |
char |
long |
Sign-extend |
char |
long 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 |
unsigned long long |
Sign-extend to long long ; convert long long to unsigned long long |
char |
float |
Represent exactly as float |
char |
double |
Represent exactly as double |
char |
long double |
Represent exactly as long double |
short |
char |
Preserve low-order byte |
short |
long |
Sign-extend |
short |
long 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 |
unsigned long long |
Sign-extend to long long ; convert long long to unsigned long long |
short |
float |
Represent exactly as float |
short |
double |
Represent exactly as double |
short |
long double |
Represent exactly as long double |
long |
char |
Preserve low-order byte |
long |
short |
Preserve low-order word |
long |
long long |
Sign-extend |
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 |
unsigned long long |
Sign-extend to long long ; convert long long to unsigned long long |
long |
float |
Represent as float . If long can't be represented exactly, some precision is lost. |
long |
double |
Represent exactly as double |
long |
long double |
Represent exactly as long double |
long long |
char |
Preserve low-order byte |
long long |
short |
Preserve low-order word |
long long |
long |
Preserve low-order dword |
long long |
unsigned char |
Preserve low-order byte |
long long |
unsigned short |
Preserve low-order word |
long long |
unsigned long |
Preserve low-order dword |
long long |
unsigned long long |
Preserve bit pattern; high-order bit loses function as sign bit |
long long |
float |
Represent as float . If long long can't be represented exactly, some precision is lost. |
long long |
double |
Represent as double . If long long can't be represented exactly as a double , some precision is lost. |
long long |
long double |
Represent as double . If long long can't be represented exactly as a double , some precision is lost. |
1 All char
entries assume that the char
type is signed by default.