Integer
Integer[intydžr] je vprogramováníoznačení celočíselnéhodatového typu,který představujekonečnoupodmnožinuzcelých čísel.Celočíselné datové typy mají v různýchprogramovacích jazycíchrůznou definici. Podle velikosti uložené informace (např. 16, 32 nebo 64 bitů) umožňují uchovat celé číslo z určitéhointervalua mohou (ale nemusejí) podporovat uložení znaménka (tj.záporného čísla).Hardwarepočítačů téměř vždy poskytuje způsob, jak reprezentovatadresu v paměti,obsahpamětineboregistrjako celé číslo.
Hodnota a její reprezentace
[editovat|editovat zdroj]Hodnotapoložky celočíselného typu je matematické celé číslo, kterému odpovídá. Celočíselné typy mohou býtbez znaménka(schopné reprezentovat pouze nezáporná celá čísla) nebose znaménkem(schopné reprezentovat i záporná celá čísla).[1]Znaménko je ukládáno do jednoho bitu (vizznaménkový bit).
Celočíselná hodnota se vezdrojovém kóduprogramu obvykle uvádí jako posloupnost číslic, případně s předchozím + nebo −. Některé programovací jazyky umožňují jiné zápisy, například jakohexadecimální(základ 16) neboosmičkový(základ 8). Některé programovací jazyky také povolují oddělovače skupin číslic.[2]
Vnitřní reprezentacetéto hodnoty je způsob, jakým je hodnota uložena vpamětipočítače. Na rozdíl od matematických čísel, hodnota v počítači má typicky nějakou minimální a maximální možnou hodnotu.
Nejčastější reprezentace kladného celého čísla je řetězecbitů,tj. pomocíbinární číselné soustavy.Pořadíbajtův paměti při ukládání se liší; vizendianita.Rozsahnebopřesnostceločíselného typu je počet bitů, které jej zastupují. Pomocí typu snbity lze zakódovat 2nčísel; například při uložení hodnoty bez znaménka obvykle představuje nezáporné hodnoty 0 až 2n−1 (jedna z možných hodnot je nula). Jiné způsoby kódování celočíselných hodnot do bitové podoby jsou napříkladBinárně kódovaná desítka,Grayův kódnebo kódy znaků vASCII.
K dispozici jsou čtyři nejznámějšízpůsoby, jak reprezentovat záporná číslav binárním systému. Nejčastější jedvojkový doplněk,který umožňuje datovému typu integer se znaménkem anbity reprezentovat čísla od −2(n−1)do 2(n−1)−1. Aritmetika dvojkovového doplňku je výhodná, protože má dokonaloubijekcimezi reprezentací a hodnotou (zejména nerozlišuje mezi +0 a −0), a protožesčítání,odčítáníanásobenínemusí rozlišovat mezi typy se znaménkem a bez znaménka. Další možnosti zahrnují binární offset,sign-magnitudeajedničkový doplněk.
Některé počítačové jazyky definují velikosti datového typu integer nezávisle na použitém počítači, jiné mají různé definice v závislosti na základnívelikosti slova(word) v danémprocesoru.Ne všechny jazykové implementace definují proměnné pro všechny celočíselné velikosti a definice určitých rozsahů ani nemusí být v konkrétní realizaci uvedena. Integer v jednomprogramovacím jazycenemusí být stejného rozsahu (velikosti) jako v jiném jazyce nebo na jiném procesoru.
Běžné integrální datové typy
[editovat|editovat zdroj]Bitů | Název | Rozsah(proDvojkový doplněku záporných čísel) | Desetinných řádů (průměr.) | Použití | Implementace | ||||
---|---|---|---|---|---|---|---|---|---|
C/C++ | C# | PascalaDelphi | Java | SQLŠablona:Cref2 | |||||
4
|
nibble,semioctet | Se znaménkem:Od −8 do 7, od −(23) do 23− 1 | 1
|
BCD,reprezentace jednoho čísla | n/a | n/a | n/a | n/a | n/a |
Bez znaménka:Od 0 do 15, což je 24− 1 | 2
| ||||||||
8
|
byte,octet | Se znaménkem:Od −128 do 127, od −(27) do 27− 1 | 3
|
ASCIIznaky | int8_t,charŠablona:Cref2 | sbyte | Shortint | byte | tinyint |
Bez znaménka:Od 0 do 255, což je 28− 1 | 3
|
uint8_t,charŠablona:Cref2 | byte | Byte | n/a | unsigned tinyint | |||
16
|
halfword,word,short | Se znaménkem:Od −32,768 do 32,767, od −(215) do 215− 1 | 5
|
UCS-2znaky | int16_t,shortŠablona:Cref2,intŠablona:Cref2 | short | Smallint | short | smallint |
Bez znaménka:Od 0 do 65,535, což je 216− 1 | 5
|
uint16_t | ushort | Word | charŠablona:Cref2 | unsigned smallint | |||
32
|
word,long,doubleword, longword, int | Se znaménkem:Od−2,147,483,648 do 2,147,483,647,od −(231) do 231− 1 | 10
|
UTF-32znaky,Barevná hloubkas alphou,FourCC,ukazatele v32bitovém programování | int32_t,intŠablona:Cref2,longŠablona:Cref2 | int | LongInt;IntegerŠablona:Cref2 | int | int |
Bez znaménka:Od 0 do 4,294,967,295, což je 232− 1 | 10
|
uint32_t | uint | LongWord;DWord;CardinalŠablona:Cref2 | n/a | unsigned int | |||
64
|
word, doubleword, longword, long long, quad, quadword, qword, int64 | Se znaménkem:Od −9,223,372,036,854,775,808 do 9,223,372,036,854,775,807, od −(263) do 263− 1 | 19
|
Čas(millisekundy odUnixového času), ukazatele v64bitovém programování | int64_t,longŠablona:Cref2,long longŠablona:Cref2 | long | Int64 | long | bigint |
Bez znaménka:Od 0 do 18,446,744,073,709,551,615, což je 264− 1 | 20
|
uint64_t | ulong | UInt64;QWord | n/a | unsigned bigint | |||
128
|
octaword, double quadword | Se znaménkem:Od−170,141,183,460,469,231,731,687,303,715,884,105,728 do 170,141,183,460,469,231,731,687,303,715,884,105,727, od −(2127) do 2127− 1 | 39
|
Složité vědecké výpočty
IPv6adresa,GUIDs |
C: pouze dostupné v nestandardních knihovnách pro specifické kompilátory | n/a | n/a | n/a | n/a |
Bez znaménka:Od 0 do 340,282,366,920,938,463,463,374,607,431,768,211,455, což je 2128− 1 | 39
| ||||||||
n
|
n-bit integer (general case) |
Se znaménkem:(−(2n−1)) do (2n−1− 1) | ⌈(n− 1) log102⌉ | Ada:rozsah -2**(n-1)..2**(n-1)-1 | |||||
Bez znaménka:0 do (2n−1) | ⌈nlog102⌉ | Ada:rozsah 0..2**n-1,mod 2**n;standardní knihovny nebo rozšiřující aritmetické knihovny BigDecimal nebo Decimal classes v mnoha jazycích jako Python, C++, atd. |
Různéprocesorypodporují různé celočíselné datové typy. Typicky hardware podporuje znaménkové i bezznaménkové datové typy, ale jen v několika málo šířkách (rozsazích).
Výše uvedená tabulka uvádí šířky celočíselných typů, které jsou podporovány přímo v hardwaru běžných procesorů. Vyšší programovací jazyky poskytují více možností. Je běžné mít celočíselný typ, který má dvakrát tolik bitů než největší hardwarově podporovaný typ. Mnohé jazyky mají také typybitových polí(určitý počet bitů, obvykle omezena tak, aby byla nižší než maximální hardwarově podporovaná šířka) arozsahovétypy (které mohou reprezentovat pouze celá čísla v zadaném rozsahu).
Některých jazyky, napříkladLisp,Smalltalk,REXX,Haskell,PythonaPerl 6,podporují celá čísla slibovolnou přesností(známá jakocelá čísla s nekonečnou přesnostínebobignums). Další jazyky, které nepodporují tento koncept jako konstrukci datových typů mohou mít knihovny, které reprezentují velmi velká čísla pomocí pole menších proměnných. Mezi ně patří knihovny jakoBigIntegerv Javě nebo "bigint"balíček v Perl 5.[3]Ty pak používají k uložení čísla tolik paměti, kolik je potřeba. Nicméně, počítač má pouze omezené množství úložného prostoru, takže i ona mohou představovat jen konečnou podmnožinu matematických čísel. Tyto režimy podporu velmi velká čísla, například jeden kilobyte paměti lze použít k ukládání čísla do 2466 desetinných číslic.
Typbooleannebo flag může představovat jen dvě hodnoty: 0 a 1, které se obvykle chápou jako nepravda (false) resp.pravda(true). Tento typ může být uložen v paměti pomocí jediného bitu, ale často využívá celý byte pro snazší adresování a rychlost přístupu.
Čtyřbitová proměnná se označuje jakonibble(menší nežkousnutí,angl.bite) nebonybble(slovní hříčka na formu slovabyte). Jedennibbleodpovídá jedné číslici všestnáctkové soustavěa představuje jednu číslici nebo kód znaménka v binární kódované dekadické soustavě.
Bajty a oktety
[editovat|editovat zdroj]Termínbajt(byte) původně znamenal nejmenší adresovatelnou jednotku paměti. Byte má obvykle 8 bitů, vzácně se vyskytly i počítače s jinou šířkou bajtu, počítače, které mohly adresovat jednotlivé bity (bitově adresovaný stroj), nebo naopak skupiny po například 16 nebo 32 bitech (adresování poslovech). Termínbajtnebyl obvykle vůbec používán v souvislosti se stroji adresovanými po bitech či slovech.
Termínoktetse vždy vztahuje na rozsah 8-bitů a většinou se používá v oblastipočítačových sítí,kde umožňuje komunikaci počítačům s různými šířkami bajtu.
V moderním použitíbajttéměř vždy znamená osm bitů, protože všechny ostatní velikosti se přestaly používat, takžebajtse stal synonymem prooktet.
Slova
[editovat|editovat zdroj]Výraz „slovo“(anglickyword) se používá pro malou skupinu bitů, které procesor konkrétníarchitekturyzpracovává najednou. Velikost slova je tedy specifická pro danýprocesor.Mezi užívanými velikostmi slova byla například slova o 6, 8, 12, 16, 18, 24, 32, 36, 39, 48, 60 nebo 64 bitech. Protože je velikost slova závislá na dané architektuře, je jeho velikost obvykle stanovena prvním procesorem v dané rodině procesorů. Významy termínů odvozených odslova,jakodlouhé-slovo (longword), dvoj-slovo (doubleword), čtyř-slovo (quadword), a půl-slovo (halfword),se také mění podle použitého procesoru nebooperačního systému.[4]
Prakticky všechny aktuální desktopové procesory (v roce 2017) jsou schopny používat 64bitová slova, i když jsou stále běžné procesory provestavěné systémy,které jsou 8bitové nebo 16bitové. Délka slova 36 bitů byla běžná v raných letech vývoje počítačů.
Jednou z významných příčin nekompatibilního softwaru je nesprávný předpoklad, že všechny počítače mají stejnou velikost slova, jako počítač používanýprogramátorem.Například pokud programátor používající jazyk C a nesprávně deklaruje proměnnou, která bude použita k uložení hodnoty větší než 215-1, jakodatový typint
,program nebude možné spustit na počítačích s 16bitovou šířkou datového typu integer. Taková proměnná by měla být deklarována jakolong
(který má alespoň 32 bitů na jakémkoliv počítači). Programátoři mohou také nesprávně předpokládat, žeukazatel(pointer) může být převeden na celé číslo beze ztráty informace, což mohlo fungovat na (některých) 32bitových počítačích, ale na 64bitových počítačích s 64bitovou šířkou ukazatele a 32bitovými datovými typy integer to však nefunguje.
Krátký (short) integer
[editovat|editovat zdroj]Krátký (short) integermůže představovat celé číslo, které potřebuje méně úložného prostoru, ve srovnání se standardním integerem na stejném stroji.
V jazyceC,je označován jakoshort.Je podmíněn šířkou alespoň 16 bitů a je často menší než standardní integer, ale to není nutné.[5][6]Kompatibilní program může předpokládat, že lze bezpečné ukládání hodnoty mezi −(215−1)[7]a 215−1,[8]ale nesmí předpokládat že rozsah není větší. VJavějeshortvždy16bitové celé číslo. VeWindows APIje datový typSHORTdefinována jako 16bitové celé číslo se znaménkem na všech strojích.[4]
Běžné velikosti krátkého (short) integeru
[editovat|editovat zdroj]Programovací jazyk | Platforma | Název datového typu | Znaménko | Rozsah v bajtech | Minimální hodnota | Maximální hodnota |
---|---|---|---|---|---|---|
CandC++ | Běžná implementace | short | Se znaménkem | 2
|
−32,767 [pozn. 1]
|
+32,767
|
unsigned short | Bez znaménka | 2
|
0
|
65,535
| ||
C# | .NET CLR/CTS | short | Se znaménkem | 2
|
−32,768
|
+32,767
|
ushort | Bez znaménka | 2
|
0
|
65,535
| ||
Java | Java platform | short | Se znaménkem | 2
|
−32,768
|
+32,767
|
Dlouhý (long) integer
[editovat|editovat zdroj]Long integer může reprezentovat celéčíslo,jehož rozsah je větší nebo rovnen standardnímu integeru na stejném stroji.
VC,je označován jakolong.Musí mít alespoň 32 bitů, a může nebo nemusí být větší, než je standardní integer. V kompatibilní programu, lze předpokládat, že může bezpečně ukládat hodnoty mezi −(231−1)[7]a 231−1,[8]ale nemusí předpokládat, že rozsah není větší.
Běžné rozsahy long integeru
[editovat|editovat zdroj]Programovací jazyk | Typ schválení | Platforma | Název datové typu | Rozsah vbajtech | Rozsah se znaménkem | Rozsah bez znaménka |
---|---|---|---|---|---|---|
CISO/ANSI C99 | Mezinárodní standard | Unix,16/32bitové systémy[4] |
long† | 4 (minimálně požaduje 4) |
−2,147,483,647 do +2,147,483,647 | 0 do 4,294,967,295 (minimální požadavek) |
CISO/ANSI C99 | Mezinárodní standard | Unix, |
long† | 8 minimálně požaduje 4) |
−9,223,372,036,854,775,807 do +9,223,372,036,854,775,807 | 0 do 18,446,744,073,709,551,615 |
C++ISO/ANSI | Mezinárodní standard | Unix,Windows, 16/32-bit system |
long† | 4[9] (minimálně požaduje 4) |
−2,147,483,648 do +2,147,483,647 |
0 do 4,294,967,295 (minimální požadavek) |
C++/CLI | Mezinárodní standard ECMA-372 |
Unix,Windows, 16/32-bit systems |
long† | 4[10] (minimálně požaduje 4) |
−2,147,483,648 todo +2,147,483,647 |
0 do 4,294,967,295 (minimální požadavek) |
VB | Standard společnosti | Windows | Long | 4[11] | −2,147,483,648 do +2,147,483,647 | N/A |
VBA | Standard společnosti | Windows,Mac OS X | Long | 4[12] | −2,147,483,648 do +2,147,483,647 | N/A |
SQL Server | St Standard společnosti | Windows | BigInt | 8 | −9,223,372,036,854,775,808 do +9,223,372,036,854,775,807 | 0 do 18,446,744,073,709,551,615 |
C#/VB.NET | ECMA Mezinárodní standard | Microsoft.NET | longorInt64 | 8 | −9,223,372,036,854,775,808 do +9,223,372,036,854,775,807 | 0 do 18,446,744,073,709,551,615 |
Java | Standard společnosti/ Mezinárodní standard | Java platform | long | 8 | −9,223,372,036,854,775,808 do +9,223,372,036,854,775,807 | N/A |
Pascal | ? | Windows,UNIX | int64 | 8 | −9,223,372,036,854,775,808 do +9,223,372,036,854,775,807 | 0 do 18,446,744,073,709,551,615(Qword typ) |
†termínlong a intje ekvivalentní[13]
Long Long
[editovat|editovat zdroj]Ve C99 verziprogramovacího jazyk CaC++11verziC++,jelong long
datový typ který má minimálně dvojí rozsah standardníholong.Tento typ není podporován kompilátory, které vyžadují aby kód byl v souladu s předchozím C++ standardem C++03, protože v C++03 tento datový typ neexistuje. Pro ANSI/ISO kompatibilní kompilátory, jsou minimální požadavky na rozsah pro tento typ od −(263−1)[7]do 263−1 pro typ se znaménkem a 0 264–1 pro typ bez znaménka[8].Tyto dva požadavky musí být splněny, nicméně rozšíření tohoto rozsahu je povoleno.[14][15]To může vést k problémům při výměně kódu a dat mezi platformami, nebo při přímém přístup k hardwaru. Existuje několik sad záhlaví poskytujícíchplatformněnezávislé rozsahy pro rozsahy datových typů. Standardní knihovna v C poskytujestdint.h.Tato knihovna byla implementována v C99 a C++11.
Související články
[editovat|editovat zdroj]- Zobrazení záporných čísel
- Binární kódované desetinné číslo,reprezentace celých čísel, běžně používané v finančních aplikacích a v databázích
- Přetečení integeru
- Datové typy v jazyce C
Poznámky
[editovat|editovat zdroj]- ↑Standard ISO C dovoluje implementacím, aby vyhradily hodnotu se znaménkovým bitem 1 a všemi ostatními 0 (pro reprezentaci znaménko-velikost a dvojkový komplement), nebo se všemi bity = 1 (pro jedničkový komplement) jako "past", hodnotu jež označuje (například) přetečení.
Reference
[editovat|editovat zdroj]V tomto článku byl použitpřekladtextu z článkuInteger (computer science)na anglické Wikipedii.
- ↑CHEEVER, Eric.Representation of numbers[online]. Swarthmore College [cit. 2011-09-11].Dostupné online.
- ↑A look at Java 7's new features[online].Dostupné online.
- ↑BigInteger (Java Platform SE 6)[online]. Oracle [cit. 2011-09-11].Dostupné online.
- ↑abcdeFOG, Agner.Calling conventions for different C++ compilers and operating systems: Chapter 3, Data Representation[online]. 2010-02-16 [cit. 2010-08-30].Dostupné online.
- ↑GIGUERE, Eric.The ANSI Standard: A Summary for the C Programmer[online]. 1987-12-18 [cit. 2010-09-04].Dostupné online.
- ↑abMeyers, Randy (2000-12-01).
- ↑abcISO/IEC 9899:201x[online]. open-std.org [cit. 2016-06-20]. S. section 6.2.6.2, paragraph 2.Dostupné online.
- ↑abcISO/IEC 9899:201x[online]. open-std.org [cit. 2016-06-20]. S. section 5.2.4.2.1.Dostupné online.
- ↑Dostupné online.
- ↑Dostupné online.
- ↑VB 6.0 help file
- ↑Dostupné online.
- ↑Dostupné online.
- ↑Dostupné online.
- ↑[cit. 2017-01-11].Dostupné v archivupořízeném dne 22-08-2010.
- Sybase Adaptive Server Enterprise 15.5: Exact Numeric Datatypes[online].Dostupné online.
- MySQL 5.6 Numeric Datatypes[online].Dostupné online.