2 TYPY, OPERATORY I WYRAŻENIA
Kwalifikatory signed (ze znakiem liczby) i unsigned (bez znaku liczby) można stosować razem z typem char lub dowolnym typem całkowitym. Liczby unsigned są zawsze dodatnie lub równe zero i podlegają regułom arytmetyki modulo 2n , gdzie n jest liczbą bitów reprezentujących dany typ. A więc, na przykład, gdy obiekt typu char zajmuje 8 bitów, wówczas zmienne typu unsigned char przyjmują wartości od 0 do 255, podczas gdy zmienne typu signed char wartości od -128 do 127 (dla maszyn, w których stosuje się notację uzupełnieniową do dwójki). To, czy zwykły obiekt typu char jest liczbą ze znakiem czy bez znaku, zależy od maszyny, przy czym wartości znaków drukowalnych z założenia są zawsze dodatnie.
Typ long double wprowadza liczbę zmiennopozycyjną o rozszerzonej precyzji. Podobnie jak dla typów całkowitych, rozmiary obiektów zmiennopozycyjnych zależą od implementacji; typy float, double i long double mogą reprezentować jeden, dwa lub trzy odmienne rozmiary obiektów.
W standardowych plikach nagłówkowych <limits.h> i <float.h> zdefiniowano stałe symboliczne dla wszystkich tych rozmiarów danych oraz dla innych właściwości maszyny i kompilatora. Ten temat omawiamy szerzej w dodatku B. ,
Ćwiczenie 2.1. Napisz program wyznaczający dziedziny wartości zmiennych typu char, short, int i long opatrzonych kwalifikatorami signed i unsigned. Wynik powinien zawierać odpowiednie wartości ze standardowych plików nagłówkowych oraz wartości obliczone bezpośrednio przez program. Trudniejszym zadaniem jest wyliczenie zakresów dla różnych typów zmiennopozycyjnych.
]
Stała całkowita, taka jak 1234, jest obiektem typu int. W stałej typu long na kona występuje litera I (el) lub L, jak w 123456789L. Stała całkowita nie mieszcząca stf w zakresie typu int jest także traktowana jak stała typu long. W stałych typ^ unsigned na końcu występuje litera u lub U, a końcówka ul oraz UL oznacza stall typu unsigned long. I
Stałe zmiennopozycyjne zawierają albo kropkę dziesiętną (np. 123.4), albo wykładnik (np. 1 e-2), albo obie te części naraz. Typem stałej zmiennopozycyjnej ja double, chyba że końcówka stanowi inaczej. Występująca na końcu litera f 1^ F oznacza obiekt typu float, a litera I lub L - obiekt typu long double.
Wartość całkowitą - zamiast w postaci dziesiętnej - można przedstawiać równik w postaci ósemkowej lub szesnastkowej. Początkowe zero w stałej całkowitej oznacz* liczbę ósemkową, natomiast początkowe znaki 0x lub 0X oznaczają liczbę szesna*1 kową. Zatem na przykład liczbę dziesiętną 31 można przedstawić jako 037 ósemki wo oraz jako 0x1 f (bądź 0X1F) szesnastkowo. Umieszczenie litery L na końcu stafc
2.3 STAŁE
ósemkowej lub szesnastkowej tworzy z niej stałą typu long, a m/a.
U tworzy stałą bez znaku. Zapis OXFUL oznacza stałą typu unsigned long o wartości dziesiętnej równej 15.
Stała znakowa jest liczbą całkowitą; taką stałą tworzy jeden znak ujęty w apostrofy, np. x\ Jej wartością jest wartość kodu znaku w maszynowym zbiorze znaków. Na przykład w zbiorze znaków ASCII wartością stałej ’0’ jest 48 - liczba nie mająca nic wspólnego z numeryczną wartością 0. Napisanie ’0’ zamiast wartości numerycznej, takiej jak 48 (która zależy od zbioru znaków), uniezależnia program od specyficznych wartości i sprawia, że jest on bardziej czytelny. Stałe znakowe uczestniczą w operacjach numerycznych na równi z innymi liczbami całkowitymi, najczęściej jednak są stosowane do porównań z innymi znakami.
Pewne znaki niegraficzne mogą być reprezentowane w stałych znakowych i napisowych przez sekwencje specjalne, takie jak\n (znak nowego wiersza). Sekwencja specjalna wygląda jak dwa znaki, ale reprezentuje tylko jeden znak. Dodatkowo za pomocą takiej sekwencji można utworzyć dowolny bitowy wzorzec bajtu w postaci
'\ooo'
gdzie ooo oznacza jedną, dwie lub trzy cyfry ósemkowe (0...7), bądź w postaci
i\xhh*
gdzie hh oznacza jedną lub więcej cyfr szesnastkowych (0...9, a...f, A...F). Możemy więc napisać
#define VTAB ’\013’ /* ASCII: pionowy tabulator */
#define BELL ’\007’ /* ASCII: znak alarmu */
lub to samo w postaci szesnastkowej
#define VTAB ’\xb’ /* ASCII: pionowy tabulator */
#define BELL ’\x7’ /* ASCII: znak alarmu */
Niżej podajemy kompletną listę sekwencji specjalnych języka C:
\a |
znak alarmu |
w |
znak \ |
\b |
znak cofania |
\? |
znak zapytania |
\f |
znak nowej strony |
V |
znak apostrofu |
\n |
znak nowego wiersza |
\” |
znak cudzysłowu |
\r |
znak powrotu karetki |
\ooo |
liczba ósemkowa |
\t |
znak tabulacji poziomej |
\xhh |
liczba szesnastkowa |
W |
znak tabulacji pionowej |
63