Literał liczbowy
Literał liczbowy – literał reprezentujący konkretną wartość liczbową wpisaną bezpośrednio w kod źródłowy tworzonej aplikacji.
Literał liczbowy jest też często w literaturze przedmiotu nazywany stałą liczbową lub po prostu liczbą. Jak z powyższej definicji wynika, ten rodzaj jednostek leksykalnych służy do wprowadzania do kodu źródłowego konkretnych wartości liczbowych znanych na etapie tworzenia programu.
Podział
Ze względu na sposób zapisu wartości liczbowej, wyróżnia się literały liczbowe:
- całkowitoliczbowe
- stałopozycyjne (nazywane także liczbami rzeczywistymi dziesiętnymi)
- zmiennopozycyjne (nazywane także liczbami rzeczywistymi lub wykładniczymi).
Ponadto w zależności od podstawy systemu liczbowego, literał może być liczbą:
- dwójkową (bin)
- ósemkową (oct)
- dziesiętną (dec)
- szesnastkową (hex)
- inną (przy systemie o innej, dowolnej podstawie).
Reprezentacja znakowa liczb dziesiętnych
Literały liczbowe, jak każda jednostka leksykalna, reprezentowana jest przez wybrany zestaw znaków:
- Dla literałów dziesiętnych całkowitoliczbowych są to znaki cyfr arabskich: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Oprócz cyfr, w niektórych językach programowania częścią takiego literału jest znak określający, czy liczba jest dodatnia „+”, czy ujemna „-”, np. 50, -123, 0.
<integer> ::= ['-' | '+'] <digit> {<digit>} <digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
- W przypadku liczb stałopozycyjnych (nazywanych także analogicznie do terminologii matematycznej – dziesiętnymi), zestaw powyższych znaków, z których może być zbudowany literał dziesiętny całkowitoliczbowy, rozszerzony jest o znak kropki „.” oddzielający część całkowitą od części ułamkowej. W nowszych systemach programowania znakiem rozdzielającym może być inny znak, np. przecinek „,”, w zależności od ustawień narodowych, np. 1.2; -17.0001; +.4; 12,12.
<fixed> ::= [<integer>] <dot> [<digit> {<digit>}] <dot> ::= '.' | ','
- W literałach zmiennopozycyjnych (nazywanych także analogicznie do terminologii matematycznej – wykładniczymi, naukowymi, inżynierskimi) występuje dodatkowo znak rozdzielający mantysę od cechy. Najczęściej stosuje się w tym celu literę „e” lub „E”. Mantysa najczęściej musi spełniać warunki literału stałopozycyjnego lub całkowitoliczbowego, a cecha (wykładnik) literału całkowitoliczbowego.
<float> ::= <fixed> <symbol_e> <integer> <symbol_e> ::= 'E' | 'e' | 'd' | 'D'
Powyższe zasady są uogólnieniem spotykanym w większości języków programowania, tylko w nielicznych implementacjach mogą występować pewne, inne rozwiązania.
W większości języków programowania istnieje podział na liczby całkowite i rzeczywiste. Zapis stałopozycyjny liczb jest więc tylko rodzajem zapisu, uproszczonym w stosunku do zapisu zmiennopozycyjnego, lecz reprezentacja w pamięci tej samej liczby w obu zapisach, np. -10.1 i -1.01E1, będzie identyczna. Są jednak języki w których ta reprezentacja jest inna, odrębna. Tak jest np. w języku PL/I, gdzie istnieje typ FIXED (stałopozycyjny) i FLOAT (zmiennopozycyjny), o różnej reprezentacji liczb w pamięci komputera. Tylko odpowiedni (niezwykle rozbudowany w tym konkretnym języku) aparat konwersji (rzutowania) pozwana na prowadzenie obliczeń z użyciem obu typów liczb równocześnie.
Reprezentacja znakowa w innych systemach
Zestaw znaków, z których budowane są literały reprezentujące wartość liczbową zapisaną w systemie o innej podstawie niż dziesiętna, zwykle rozszerzony jest o:
- znaki reprezentujące cyfry w wartościach większych niż 9, a więc 10, 11 … itd..
- znaki umożliwiające rozróżnienie podstawy systemu liczbowego
Cyfry reprezentujące wartości 10 i większą, zapisywane są za pomocą liter: A lub a=10, B lub b=11, … itd.
Do identyfikacji podstawy systemu liczbowego stosuje się specjalne znaki niebędące cyframi lub odpowiedni zapis liczby, np.
- język Pascal:
- dziesiętne, np. 72, -15, 0
- szesnastkowe, liczba poprzedzona znakiem $, np. $15, $AB, -$1C, $00
- język C:
- dziesiętne, np. 72, -15, 0
- ósemkowe, liczba poprzedzona znakiem zera wiodącego, np. 015, -0625
- szesnastkowe, liczba poprzedzona znakami zero i x, tzn. 0x lub 0X, np. 0x15, 0XAB, -0X1c
- język PL/I:
- dziesiętne, np. 72, -15, 0
- dwójkowe, zakończone literą B, np. 0011101B, -1111B
- język PL/M:
- dziesiętne, np. 72, -15, 0
- dwójkowe, zakończone literą B, np. 0011101B, -1111B
- ósemkowe, zakończone literą Q lub O, np. 15Q, -0625O
- szesnastkowe, zakończone literą H, np. 15H, 0ABH, -0FFH
Jak z powyższych przykładów wynika, w różnych językach oznacznik podstawy systemu może być umieszczony:
- na początku literału, przed znakami reprezentującymi wartość liczby
- na końcu literału, po znakach reprezentujących wartość liczby.
Oba rozwiązana kreują pewne trudności interpretacyjne kodu źródłowego:
- gdy oznacznik jest na początku literału i jest literą, nie ma możliwości odróżnienia liczby od identyfikatora, w tym przypadku niezbędne jest stosowanie nieznaczącego zera wiodącego, które informuje translator, że dana jednostka leksykalna jest literałem liczbowym, np. w języku C: 0x5, gdyby pominąć zero, napis zostałby potraktowany jak identyfikator x5; nie ma tego problemu, gdy stosuje się inny znak niż literę, np. w języku Pascal: $FF,
- gdy oznacznik stoi na końcu literału, dla liczb w systemie o podstawie większej niż 10, jeżeli pierwsza cyfra ma wartość większą niż 9 (co oznacza, że jest reprezentowana przez literę), również nie ma możliwości odróżnieni tej liczby od identyfikatora, co rozwiązuje się także przez stosowanie zera wiodącego, np. PL/M: 0FFH.
Inne oznaczniki
W wielu językach istnieją dodatkowe elementy literału liczbowego pozwalające na określoną jego interpretację.
Przykładowe oznaczniki:
- w języku C może istnieć oznacznik wielkości liczby, np. litera L identyfikuje, że dana liczba jest liczbą długą (long), np. 5L,
- w języki PL/I litera I na końcu literału, identyfikuje, że jest to część urojona liczby zespolonej, np. 12+24.6I,
- w języku Icon oznacznik r oddziela podstawę zastosowanego systemu liczbowego od właściwej wartości liczby, np. 32ramn.
Formatowanie zapisu liczb
W wielu zastosowaniach często stosuje się specjalne formatowanie zapisu liczb, szczególnie liczb dużych, składających się z wielu znaków, w celu ułatwienia odczytu takiej liczby i zmniejszenia prawdopodobieństwa błędu takiego odczytu przez człowieka. Typowym przykładem takiego formatowania jest grupowanie cyfr, np. po trzy i separowanie ich specjalnym znakiem, np. spacją, kropką, przecinkiem. Składnia większości języków nie dopuszcza takiego specjalnego formatowania, a rolę tę przejęły współcześnie zaawansowane edytory kodu źródłowego. Jednak w pewnych językach, głównie we wczesnych ich wersjach, gdy ograniczenia systemów uniemożliwiały formatowanie na poziomie edytorów, dopuszczono zapis literałów liczbowych sformatowanych, w zakresie grupowania cyfr.
język programowania | separator grupy cyfr | przykład zapisu |
---|---|---|
Algol 60, Fortran | spacja | 1 000 000 |
Ada | _ znak podkreślenia | 1_000_000 |
D | _ znak podkreślenia | 1_00__0000_0 |
Literały liczbowe w językach programowania
Literały liczbowe dziesiętne
Język programowania | Całkowitoliczbowe | rzeczywiste | inne | |
---|---|---|---|---|
stałopozycyjne | zmiennopozycyjne | |||
Algol 60 | [znak]cyfry | [znak][cz_całk][.cz_ułamk][10cecha] np. -7.5, .678, 12.12105 | ||
C | [znak]cyfry[oznacznik] np. 50, +50L, -50 | [znak]cz_całk[.cz_ułamk[e lub Ececha]] np. 5E2, -7.4, 0.987, 12.456e-15 | ||
COBOL | [znak]cyfry | [znak][cz_całk].[cz_ułamk] | brak | |
Fortran 77 | [znak]cyfry | [znak]cz_całk[.cz_ułamk][Ececha] np. 5E2, -7.4, 0.987, 12.456E-15 |
| |
Pascal | [znak]cyfry np. 50, +50, -50 | [znak]cz_całk[.cz_ułamk[e lub Ececha] ] np. 5E2, -7.4, 0.987, 12.456e-15 | dane podwójnej precyzji (Pascal 360): [znak]cz_całk[.cz_ułamk][Dcecha] np. 5D2, 0.1223453D-55 | |
PL/I | brak typu całkowitego, liczby całkowite można reprezentować jako stałopozycyjne z zerową liczbą cyfr ułamkowych, np. FIXED DEC(5,0) | [znak][cz_całk].[cz_ułamk] np. 5, -7., .987, 12.456 | [znak][cz_całk[.]][.cz_ułamk]<e lub E>[cecha] np. 5, -7., .987, 12.456 | liczby zespolone: [część_rzeczywista][+ lub -]część_urojona gdzie część_rzeczywista i część_urojona to liczby stałopozycyjne (FIXED) lub zmiennopozycyjne (FLOAT) |
PL/M | [znak]cyfry[D] np. 12, -37D | /* brak liczb rzeczywistych */ | ||
Snobol (Spitbol) | [znak]cyfry | [znak]cz_całk[.cz_ułamk][D lub E][cecha] np. 5D2, -7.4, 0.987, 12.456E-15 | ||
Oznaczenia:
|
Literały liczbowe o innej podstawie
Język programowania | Inne systemy liczbowe | Format zapisu | Zapis liczb | Przykłady |
---|---|---|---|---|
Ada | podstawa z zakresu 2..16 | podstawa#cyfry_bin[.cyfry_bin]#[E[znak]cyfry_dec] | całkowitych, rzeczywistych |
|
BASIC | zależnie od wersji, bardzo zróżnicowane możliwości, najbardziej rozbudowane implementacje:
|
oraz w zależności od implementacji:
| całkowitych |
|
C |
|
| całkowitych |
|
Java |
|
| całkowitych |
|
Icon | stałe z podstawą z zakresu 2..36 | podstawarcyfry_sys | całkowitych | 36rfop, 2r100101, 16rFF |
MASM (Makroasembler) |
|
| całkowitych |
|
Pascal | szesnastkowy | [znak]cyfry_hex | całkowitych | $FF, -$1, $a8c2 |
Perl |
|
| całkowitych |
|
PL/I | dwójkowy | [znak]cyfry_binB |
|
|
PL/M |
|
| całkowitych |
|
Visual Basic (Visual Studio 2008) |
|
| całkowitych |
|
Oznaczenia:
|
Zobacz też
Bibliografia
- Michael Marcotty, Henry Ledgord, W kręgu języków programowania, tłumaczenie: Krystyna Jerzykiewicz, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1342-7
- John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8
- Władysław Marek Turski, Propedeutyka Informatyki, Wydawnictwo Naukowe PWN, Warszawa 1977, wyd. II
- Ryszard K. Kott, Krzysztof Walczak. Programowanie w języku Fortran 77, Wydawnictwa Naukowo-Techniczne, Warszawa 1991, ISBN 83-204-1362-1
- Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., ISBN 83-85060-53-7, ISSN 0867-6011
- Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7
- Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4
- Paweł Gizbert-Studnicki, Jerzy Kaczmarczuk, Snobol4, Wydawnictwa Naukowo-Techniczne, Warszawa 1984, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0546-7
- Jan Bielecki, PL/M język programowania mikroprocesorów, Wydawnictwa Komunikacji i Łączności, Warszawa 1987, Seria: Elektronizacja, zeszyt 25
- Ralph E. Griswold, Madge T. Griswold, Icon, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0871-7