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