Literał liczbowy

Z Wikipedii, wolnej encyklopedii

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ł[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

Literały liczbowe dziesiętne[edytuj | edytuj kod]

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]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:

  • 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[edytuj | edytuj kod]

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
  • 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
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
  • &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ż[edytuj | edytuj kod]

Bibliografia[edytuj | edytuj kod]