‟overcq”

Zagadnienia programistyczne

Konwersje domyślne wartości liczbowych w C

W języku programowania C (na którego składni obecnie opiera się C+) trzeba deklarować, jaki rozmiar ma stała liczbowa, którą się podaje, ponieważ w przeciwnym przypadku jej wartość nie będzie obliczona poprawnie. Jest to zaszłość, której nie da się ominąć do czasu powstania pełnego ‘kompilatora’ C+. Ale w języku C+ nie potrzeba deklarować rozmiaru wszystkich stałych liczbowych dzięki korzystaniu ze ściśle zdefiniowanych reguł domyślnych konwersji.

W języku C całkowita stała liczbowa bez deklaracji rozmiaru jest typu “int” czyli jest wartością całkowitą ze znakiem. W systemach 64‐bitowych “int” ma zwykle rozmiar 32 bitów. Reguła domyślnej konwersji mówi, że przy wymaganiu większego rozmiaru (np. podczas porównywania z wartością typu “long” albo przypisywania do zmiennej typu “long”) wartość całkowita ze znakiem jest konwertowana do typu całkowitego ze znakiem wystarczającego do pomieszczenia obu wartości. Jeśli natomiast nie ma już większego typu całkowitego ze znakiem, do którego można by skonwertować (np. przy konwersji wartości typu “unsigned long” oraz “long”), to wartości są konwertowane do największego dostępnego typu całkowitego ze znakiem (czyli “long”).

W języku C+ podczas zapisu całkowitych stałych liczbowych, które mieszczą się w rozmiarze typu “int” (czyli typowo rozmiarze 32 bitów), nie należy deklarować rozmiaru stałej. Natomiast w przypadku stałych przekraczających rozmiar typu “int”, należy deklarować typ “long” (przyrostkiem “L”) lub typ “unsigned long” (przyrostkiem “UL”). Taka deklaracja ma na celu tylko zachowanie poprawnej wartości stałej liczbowej (ponieważ inaczej zostałaby obcięta do rozmiaru typu “int”), ale nie trzeba się martwić o poprawne porównanie lub przypisanie do typów równych i większych (“int”, “unsigned”, “long”, “unsigned long”) oraz porównanie z typem mniejszym (“short”, “unsigned short”, “char”, “signed char”, “unsigned char”).

Osobną kwestią jest przypisywanie całkowitej stałej liczbowej do typu o mniejszym rozmiarze (“short”, “unsigned short”, “char”, “signed char”, “unsigned char”): wartość zostanie obcięta do 16 lub 8 bitów. Dlatego przy przypisywaniu do typów “N16”, “S16”, “C”, “N8” i “S8” należy upewnić się, że wartość nie przekracza zakresu wartości użytego typu (ze znakiem albo bez znaku).