Udostępnij za pośrednictwem


Konwersje z niepodpisanych typów całkowitych

Liczba całkowita bez znaku jest konwertowana na krótszą liczbę całkowitą bez znaku lub ze znakiem, przez obcięcie najbardziej znaczących bitów lub na dłuższą liczbę całkowitą bez znaku lub ze znakiem, przez rozszerzenie o zera (zobacz tabelę Konwersje z typów całkowitych bez znaku).

Gdy wartość o typie całkowitym jest degradowana do liczby całkowitej ze znakiem o mniejszym rozmiarze lub liczba całkowita bez znaku jest konwertowana na odpowiadający typ całkowity ze znakiem, wartość jest niezmieniana, jeśli może być reprezentowana w nowym typie.Jednakże, reprezentowana wartość zmienia się, jeśli bit znaku jest ustawiony, jak w następującym przykładzie.

int j;
unsigned short k = 65533;

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

Jeśli nie może być reprezentowana, wynik jest zdefiniowany przez implementację.Zobacz Konwersje podczas rzutowania typu, aby uzyskać informacje dotyczące obsługi degradacji liczb całkowitych przez kompilator języka C firmy Microsoft.Takie samo zachowanie wynika z konwersji lub rzutowania typu liczby całkowitej.

Wartości bez znaku są konwertowane w sposób, który zachowuje ich wartość i nie jest bezpośrednio reprezentowany w języku C.Jedynym wyjątkiem jest konwersja z unsigned long na float, podczas której tracone są co najwyżej mniej znaczące bity.W przeciwnym wypadku wartość jest zachowywana, ze znakiem lub bez znaku.Kiedy wartość typu całkowitego jest konwertowana na zmiennoprzecinkową, a wartość jest poza reprezentowanym zakresem, wynik jest niezdefiniowany. (Zobacz Przechowywanie w pamięci typów podstawowych, aby uzyskać informacje dotyczące zakresów typów całkowitych i zmiennoprzecinkowych).

W następującej tabeli podsumowano konwersje z typów całkowitych bez znaku.

Konwersje z typów całkowitych bez znaku

Z

Do

Metoda

unsigned char

char

Zachowaj wzorzec bitowy; najbardziej znaczący bit staje się bitem znaku

unsigned char

short

Rozszerzenie zerami

unsigned char

long

Rozszerzenie zerami

unsigned char

unsigned short

Rozszerzenie zerami

unsigned char

unsigned long

Rozszerzenie zerami

unsigned char

typ float

Konwertuj na long; konwertuj long na float

unsigned char

double

Konwertuj na long; konwertuj long na double

unsigned char

long double

Konwertuj na long; konwertuj long na double

unsigned short

char

Zachowaj mniej znaczący bajt

unsigned short

short

Zachowaj wzorzec bitowy; najbardziej znaczący bit staje się bitem znaku

unsigned short

long

Rozszerzenie zerami

unsigned short

unsigned char

Zachowaj mniej znaczący bajt

unsigned short

unsigned long

Rozszerzenie zerami

unsigned short

typ float

Konwertuj na long; konwertuj long na float

unsigned short

double

Konwertuj na long; konwertuj long na double

unsigned short

long double

Konwertuj na long; konwertuj long na double

unsigned long

char

Zachowaj mniej znaczący bajt

unsigned long

short

Zachowaj mniej znaczące słowo

unsigned long

long

Zachowaj wzorzec bitowy; najbardziej znaczący bit staje się bitem znaku

unsigned long

unsigned char

Zachowaj mniej znaczący bajt

unsigned long

unsigned short

Zachowaj mniej znaczące słowo

unsigned long

typ float

Konwertuj na long; konwertuj long na float

unsigned long

double

Konwertuj bezpośrednio na double

unsigned long

long double

Konwertuj na long; konwertuj long na double

Specyficzne dla firmy Microsoft

Dla 32-bitowego kompilatora języka C firmy Microsoft, typ unsigned int jest równoważny typowi unsigned long.Konwersja wartości unsigned int przebiega w taki sam sposób jak konwersja wartości unsigned long.Konwersje z wartości unsigned long na float nie są dokładne, jeśli konwertowana wartość jest większa niż maksymalna dodatnia wartość long ze znakiem.

KONIEC informacji specyficznych dla firmy Microsoft

Zobacz też

Koncepcje

Konwersje przypisań