Преобразования из типов чисел со знаком
Когда знаковое целое число преобразуется в целое число без знака равного или большего размера и значение целого числа со знаком — не отрицательное, значение остается неизменным. Преобразование выполняется путем расширения знака целого числа со знаком. Целое число со знаком преобразуется в более короткое целое число со знаком путем усечения битов высокого порядка. Результат интерпретируется как значение без знака (см. данный пример).
int i = -3;
unsigned short u;
u = i;
printf_s( "%hu\n", u ); // Prints 65533
Данные не будут потеряны при преобразовании целого числа со знаком в значение с плавающей запятой, однако при преобразовании long int или unsigned long int в значение float может утратиться некоторая точность.
В следующей таблице перечислены преобразования из целочисленных типов со знаком. В этой таблице тип char является типом со знаком по умолчанию. При использовании параметра времени компиляции для изменения значения по умолчанию для типа char на тип без знака, преобразования, перечисленные в таблице Преобразования из целочисленных типов без знака для типа unsigned char, применяются вместо преобразований в следующей таблице, которая называется "Преобразования из целочисленных типов со знаком".
Преобразования из целочисленных типов со знаком
Исходный тип |
Целевой тип |
Метод |
---|---|---|
char1 |
short |
Расширение знака |
char |
long |
Расширение знака |
char |
unsigned char |
Сохранение шаблона; бит высокого порядка перестает функционировать как бит знака |
char |
unsigned short |
Расширение знака до short; преобразование short в unsigned short |
char |
unsigned long |
Расширение знака до long; преобразование long в unsigned long |
char |
float |
Расширение знака до long; преобразование long в float |
char |
double |
Расширение знака до long; преобразование long в double |
char |
long double |
Расширение знака до long; преобразование long в double |
short |
char |
Сохранение байта низкого порядка |
short |
long |
Расширение знака |
short |
unsigned char |
Сохранение байта низкого порядка |
short |
unsigned short |
Сохранение битового шаблона; бит высокого порядка перестает функционировать как бит знака |
short |
unsigned long |
Расширение знака до long; преобразование long в unsigned long |
short |
float |
Расширение знака до long; преобразование long в float |
short |
double |
Расширение знака до long; преобразование long в double |
short |
long double |
Расширение знака до long; преобразование long в double |
long |
char |
Сохранение байта низкого порядка |
long |
short |
Сохранение слова низкого порядка |
long |
unsigned char |
Сохранение байта низкого порядка |
long |
unsigned short |
Сохранение слова низкого порядка |
long |
unsigned long |
Сохранение битового шаблона; бит высокого порядка перестает функционировать как бит знака |
long |
float |
Представление в качестве float. Если long невозможно представить точно, некоторая точность теряется. |
long |
double |
Представьте в виде double. Если long невозможно представить точно так же, как double, некоторая точность теряется. |
long |
long double |
Представьте в виде double. Если long невозможно представить точно так же, как double, некоторая точность теряется. |
1. Все записи char основаны на том, что тип char по умолчанию является типом со знаком.
Блок, относящийся только к системам Microsoft
Для 32-разрядного компилятора С Microsoft целое число эквивалентно long. Преобразование значения intвыполняется так же, как и преобразование long.
Завершение блока, относящегося только к системам Microsoft