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 dane podwójnej precyzji: [znak]cz_całk[.cz_ułamk][Dcecha]np. 5D2, 0.1223453D-55 liczby zespolone (COMPEX): (liczba_rzeczywista,liczba_rzeczywista)np. (12,-17.3E-5) Pascal [znak]cyfrynp. 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ęść_urojonagdzie część_rzeczywista i część_urojonato 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-15Oznaczenia:

cecha: liczba całkowita ze znakiem lub bez znaku cz_całk: część całkowita liczby (bez znaku) cz_ułamk: część ułamkowa liczby (bez znaku) nawiasy kwadratowe []: część opcjonalna

Literały liczbowe o innej podstawie Język programowania Inne systemy liczbowe Format zapisu Zapis liczb Przykłady Adapodstawa z zakresu 2..16podstawa#cyfry_bin[.cyfry_bin]#[E[znak]cyfry_dec] całkowitych, rzeczywistych 2#1010_1000# 3#120.02#E-5 BASICzależnie od wersji, bardzo zróżnicowane możliwości, najbardziej rozbudowane implementacje: dwójkowy ósemkowy szesnastkowy &Xcyfry_bin &Ocyfry_oct &Hcyfry_hex oraz w zależności od implementacji: &cyfry ósemkowa lub szesnastkowa całkowitych &X011101 &O232 &HFF &FF C ósemkowy szesnastkowy [znak]0cyfry_oct[oznacznik] [znak]0Xcyfry_hex[oznacznik], lub 0xcyfry_hex[oznacznik] całkowitych 066, -012, 05L 0xff, -0XaC Java ósemkowy szesnastkowy [znak]0cyfry_oct [znak]0Xcyfry_hex, lub [znak]0xcyfry_hex całkowitych 023, -056 0XFF, -0xA4, 0x64 Icon stałe z podstawą z zakresu 2..36 podstawarcyfry_sys całkowitych 36rfop, 2r100101, 16rFF MASM (Makroasembler) dwójkowy ósemkowy dziesiętny szesnastkowy dowolny [znak]cyfry_binB [znak]cyfry_oct<O lub Q> [znak]cyfry_decD [znak]cyfry_hexH dyrektywa .RADIX system (2..16) całkowitych -1001B, 111011B, +111011B -1623O, -1623Q, 77Q, +77O -123, -123D, 123D, +123 -1BCH, -01BCH, 0BCH, +0BCH, 1BCH liczby w aktualnym systemie nie kończyny przyrostkiem Pascal szesnastkowy [znak]cyfry_hex całkowitych $FF, -$1, $a8c2 Perl dwójkowy ósemkowy szesnastkowy 0bcyfry_bin 0cyfry_oct 0xcyfry_hex całkowitych 0b001001 06431 0x3AC PL/I dwójkowy [znak]cyfry_binB stałopozycyjne (FIXED) zmiennopozycyjne (FLOAT) 10011.101B, -0011101B, 1.001E+6B PL/M dwójkowy ósemkowy szesnastkowy [znak]cyfry_binB [znak]cyfry_oct<O lub Q> [znak]cyfry_hexH całkowitych 0101B, 1111B, -1101B 16Q, -16O 0FFH, 2H, -5AH Visual Basic (Visual Studio 2008) ósemkowy szesnastkowy &Ocyfry_oct &Hcyfry_hex całkowitych &O345 &HFAOznaczenia: cyfry_bin=0..1 cyfry_oct=0..7 cyfry_dec=0..9 cyfry_hex=0..9, A..F cyfry_sys=0..9, A..W nawiasy kwadratowe []: część opcjonalna

Zobacz też literał literał bitowy literał łańcuchowy literał logiczny literał pusty literał zbiorowy literał znakowy jednostka leksykalna typ danych

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, John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, 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, Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., , ISSN 0867-6011 Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, Paweł Gizbert-Studnicki, Jerzy Kaczmarczuk, Snobol4, Wydawnictwa Naukowo-Techniczne, Warszawa 1984, Seria: Biblioteka Inżynierii Oprogramowania, Jan Bielecki, PL/M język programowania mikroprocesorów, Wydawnictwa Komunikacji i Łączności, Warszawa 1987, Seria: Elektronizacja, zeszyt 25