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


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

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

Если значение с целочисленным типом понижено до целого числа со знаком меньшего размера или целое число без знака преобразовано в соответствующее целое число со знаком, значение остается неизменным, если его можно представить в новом типе. Однако это значение представляет изменения, если бит знака задан, как показано в следующем примере.

int j;
unsigned short k = 65533;

j = k;
printf_s( "%hd\n", j );   // Prints -3

Если осуществить представление невозможно, результат определяется реализацией. См. раздел Преобразования приведений типа для получения сведений об обработке понижения целых чисел компилятором Microsoft C. То же поведение является результатом преобразования целого числа или типового приведения целого числа.

Значения без знака преобразуются так, чтобы сохранить свое значение, и не представлены непосредственно в С. Единственное исключение — это преобразование из unsigned long в float, которое теряется на уровне битов самого низкого порядка. В противном случае значение сохраняется (со знаком или без). Если значение целочисленного типа преобразуется в тип с плавающей запятой и это значение находится за пределами представляемого диапазона, результат не определен. (См. раздел Сохранение базовых типов для получения сведений о диапазоне для целочисленных типов и типов с плавающей запятой.)

В следующей таблице перечислены преобразования из целочисленных типов без знака.

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

Исходный тип

Целевой тип

Метод

unsigned char

char

Сохранение битового шаблона; бит высокого порядка становится битом знака

unsigned char

short

Нулевое расширение

unsigned char

long

Нулевое расширение

unsigned char

unsigned short

Нулевое расширение

unsigned char

unsigned long

Нулевое расширение

unsigned char

float

Преобразование в значение long; преобразование значения long в float

unsigned char

double

Преобразование в значение long; преобразование значения long в double

unsigned char

long double

Преобразование в значение long; преобразование значения long в double

unsigned short

char

Сохранение байта низкого порядка

unsigned short

short

Сохранение битового шаблона; бит высокого порядка становится битом знака

unsigned short

long

Нулевое расширение

unsigned short

unsigned char

Сохранение байта низкого порядка

unsigned short

unsigned long

Нулевое расширение

unsigned short

float

Преобразование в значение long; преобразование значения long в float

unsigned short

double

Преобразование в значение long; преобразование значения long в double

unsigned short

long double

Преобразование в значение long; преобразование значения long в double

unsigned long

char

Сохранение байта низкого порядка

unsigned long

short

Сохранение слова низкого порядка

unsigned long

long

Сохранение битового шаблона; бит высокого порядка становится битом знака

unsigned long

unsigned char

Сохранение байта низкого порядка

unsigned long

unsigned short

Сохранение слова низкого порядка

unsigned long

float

Преобразование в значение long; преобразование значения long в float

unsigned long

double

Непосредственное преобразование в double

unsigned long

long double

Преобразование в значение long; преобразование значения long в double

Блок, относящийся только к системам Microsoft

Для 32-разрядного компилятора Microsoft С тип unsigned int эквивалентен типу unsigned long. Преобразование значения unsigned int выполняется так же, как и преобразование unsigned long. Преобразования значений unsigned long в float не точны, если преобразуемое значение больше, чем максимальное положительное значение long со знаком.

Завершение блока, относящегося только к системам Microsoft

См. также

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

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