DODATEK A PRZEWODNIK JĘZYKA C_______—-
Gdy wartość całkowita jest przekształcana do typu ze znakiem, wówczas jej wartość nie ulegnie zmianie, jeśli może być reprezentowana w nowym typie; w przeciwnym przypadku wynik zależy od implementacji.
Przy przekształcaniu wartości typu zmiennopozycyjnego do typu całkowitego gubi się jej część ułamkową; jeśli wyniku nie można wyrazić w tym typie całkowitym, to skutek przekształcenia nie jest zdefiniowany. W szczególności nie jest zdefiniowany wynik przekształcenia ujemnej wartości zmiennopozycyjnej do typu całkowitego bez znaku.
Jeśli wartość całkowita jest przekształcana do typu zmiennopozycyjnego i zawiera się w dopuszczalnym przedziale wartości tego typu, ale nie jest dokładnie reprezentowal-na, to wynikiem jest najbliższa większa albo mniejsza reprezentował na wartość. Jeśli wartość nie zawiera się w tym przedziale, skutek nie jest zdefiniowany.
Przy przekształcaniu wielkości zmiennopozycyjnej do typu zmiennopozycyjnego o równej lub większej precyzji jej wartość nie zmienia się. Jeśli jest ona przekształcana do typu zmiennopozycyjnego o mniejszej precyzji i jej wartość zawiera się w rcprezento-walnym przedziale, wynikiem jest najbliższa większa albo mniejsza reprezentował na wartość. Jeśli wynik nie zawiera się w tym przedziale, skutek nie jest zdefiniowany.
Wiele operatorów powoduje przekształcenia swoich argumentów i określa typ wyniku według podobnych zasad. W efekcie chodzi o dopasowanie typów argumentów do wspólnego typu, który jest także typem wyniku. Poniższe reguły stanowią wzorzec zwykłych przekształceń arytmetycznych:
Po pierwsze, jeśli któryś z argumentów jest typu long double, to drugi jest przekształcany do long double.
W przeciwnym przypadku, jeśli któryś z argumentów jest typu double, to drugi jest przekształcany do double.
W przeciwnym przypadku, jeśli któryś z argumentów jest typu float, to drugi jest przekształcany do float.
W przeciwnym przypadku do obu argumentów stosuje się promocję typu całkowitego; jeśli teraz któryś z argumentów jest typu unsigned long int, to drugi jest przekształcany do unsigned long int.
W przeciwnym przypadku Jeśli jeden z argumentów jest typu long unsigned int, wynik zależy od tego, czy long int jest w stanie wyrazić wszystkie wartości typu unsigned int; jeśli tak, to argument typu unsigned int jest przekształcany do typu long int; jeśli nie - oba są przekształcane do typu unsigned long int.
W przeciwnym przypadku, jeśli jeden z argumentów jest typu long int, to drugi jest przekształcany do long int.
W przeciwnym przypadku, jeśli któryś z argumentów jest typu unsigned int, to drugi jest przekształcany do unsigned int.
W przeciwnym przypadku oba argumenty mają typ int.
Zaszły tu dwie zmiany. Po pierwsze, arytmetykę zmiennopozycyjną można wykonywać w pojedynczej precyzji; w pierwszym wydaniu książki podkreślano, że całą arytmetykę zmiennopozycyjną realizuje się w podwójnej precyzji. Po drugie, krótsze typy całkowite bez znaku w kombinacjach z dłuższymi ze znakiem nie przenoszą właściwości braku znaku arytmetycznego na typ wyniku; uprzednio właściwość braku znaku była dominująca. Nowe zasady są nieco bardziej skomplikowane, ale trochę ograniczają niespodzianki wynikające ze spotkania się wartości bez znaku z wartościami ze znakiem. Nadal można otrzymać nieoczekiwane wyniki przy porównywaniu wielkości bez znaku z wielkościami ze znakiem o tym samym rozmiarze.
Wartość całkowitą można dodać do lub odjąć od wskaźnika; jest ona wówczas przekształcana zgodnie z zasadami podanymi przy opisie operatora dodawania (p. A7.7).
Dwa wskaźniki do obiektów tego samego typu, należących do tej samej tablicy, można od siebie odjąć; w tym przypadku wynik jest przekształcany do wartości całkowitej zgodnie z zasadami podanymi przy opisie operatora odejmowania (p. A7.7).
Stałe wyrażenie całkowite o wartości zero. ewentualnie zrzutowane do typu void *, można przekształcić do wskaźnika dowolnego typu za pomocą rzutowania, przypisania lub porównania. Produkuje to pusty wskaźnik, równy innemu pustemu wskaźnikowi tego samego typu, ale różny od dowolnego wskaźnika do funkcji lub obiektu.
Dopuszcza się również inne przekształcenia wskaźników, ale są one zależne od maszyny. Takie przekształcenia muszą być realizowane za pomocą jawnych operatorów przekształcenia typów lub za pomocą rzutowania (p. A7.5 i A8.8).
Wskaźnik można przekształcić do typu całkowitego, wystarczająco obszernego, aby pomieścił wartość wskaźnika; wymagany rozmiar typu całkowitego zależy od implementacji. Od implementacji zależy również sposób takiego przekształcenia.
261