Literał liczbowy

Literał liczbowyliterał 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:

Ponadto w zależności od podstawy systemu liczbowego, literał może być liczbą:

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 matematycznejdziesię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 matematycznejwykł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 programowaniaseparator grupy cyfrprzykład zapisu
Algol 60, Fortranspacja1 000 000
Ada_ znak podkreślenia1_000_000
D_ znak podkreślenia1_00__0000_0

Literały liczbowe w językach programowania

Literały liczbowe dziesiętne

Język programowaniaCałkowitoliczbowerzeczywisteinne
stałopozycyjnezmiennopozycyjne
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]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/Ibrak 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:

  • 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 programowaniaInne systemy liczboweFormat zapisuZapis liczbPrzykłady
Ada

podstawa z zakresu 2..16

podstawa#cyfry_bin[.cyfry_bin]#[E[znak]cyfry_dec]

całkowitych, rzeczywistych
  • 2#1010_1000#
  • 3#120.02#E-5
BASIC

zależ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
Iconstałe z podstawą z zakresu 2..36podstawarcyfry_syscałkowitych36rfop, 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
Pascalszesnastkowy[znak]cyfry_hexcałkowitych$FF, -$1, $a8c2
Perl
  • dwójkowy
  • ósemkowy
  • szesnastkowy
  • 0bcyfry_bin
  • 0cyfry_oct
  • 0xcyfry_hex
całkowitych
  • 0b001001
  • 06431
  • 0x3AC
PL/Idwó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
  • &HFA

Oznaczenia:

  • 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ż

Bibliografia