Поделиться через


Преобразования из типов чисел со знаком

Когда знаковое целое число преобразуется в целое число без знака равного или большего размера и значение целого числа со знаком — не отрицательное, значение остается неизменным. Преобразование выполняется путем расширения знака целого числа со знаком. Целое число со знаком преобразуется в более короткое целое число со знаком путем усечения битов высокого порядка. Результат интерпретируется как значение без знака (см. данный пример).

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

См. также

Основные понятия

Преобразования назначений