Integer
Author
Albert FloresInteger [intydžr] je v programování označení celočíselného datového typu, který představuje konečnou podmnožinu z celých čísel. Celočíselné datové typy mají v různých programovacích jazycích různou definici. Podle velikosti uložené informace (např. 16, 32 nebo 64 bitů) umožňují uchovat celé číslo z určitého intervalu a mohou (ale nemusejí) podporovat uložení znaménka (tj. záporného čísla). Hardware počítačů téměř vždy poskytuje způsob, jak reprezentovat adresu v paměti, obsah paměti nebo registr jako celé číslo.
Hodnota a její reprezentace
Hodnota položky celočíselného typu je matematické celé číslo, kterému odpovídá. Celočíselné typy mohou být bez znaménka (schopné reprezentovat pouze nezáporná celá čísla) nebo se znaménkem (schopné reprezentovat i záporná celá čísla). +more Znaménko je ukládáno do jednoho bitu (viz znaménkový bit).
Celočíselná hodnota se ve zdrojovém kódu programu obvykle uvádí jako posloupnost číslic, případně s předchozím + nebo −. Některé programovací jazyky umožňují jiné zápisy, například jako hexadecimální (základ 16) nebo osmičkový (základ 8). +more Některé programovací jazyky také povolují oddělovače skupin číslic.
Vnitřní reprezentace této hodnoty je způsob, jakým je hodnota uložena v paměti počí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ězec bitů, tj. pomocí binární číselné soustavy. +more Pořadí bajtů v paměti při ukládání se liší; viz endianita. Rozsah nebo přesnost celočíselného typu je počet bitů, které jej zastupují. Pomocí typu s n bity 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říklad Binárně kódovaná desítka, Grayův kód nebo kódy znaků v ASCII.
K dispozici jsou čtyři nejznámější způsoby, jak reprezentovat záporná čísla v binárním systému. Nejčastější je dvojkový doplněk, který umožňuje datovému typu integer se znaménkem a n bity reprezentovat čísla od −2(n−1) do 2(n−1)−1. +more Aritmetika dvojkovového doplňku je výhodná, protože má dokonalou bijekci mezi reprezentací a hodnotou (zejména nerozlišuje mezi +0 a −0), a protože sčítání, odčítání a násobení nemusí rozlišovat mezi typy se znaménkem a bez znaménka. Další možnosti zahrnují binární offset, sign-magnitude a jednič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ém procesoru. 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. +more Integer v jednom programovacím jazyce nemusí být stejného rozsahu (velikosti) jako v jiném jazyce nebo na jiném procesoru.
Běžné integrální datové typy
Bitů | Název | Rozsah(pro Dvojkový doplněk u záporných čísel) | Desetinných řádů (průměr. ) | Použití | Implementace | ||||
---|---|---|---|---|---|---|---|---|---|
C/C++ | C# | Pascal a Delphi | Java | SQL | |||||
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 |
4 | nibble, semioctet | Bez znaménka: Od 0 do 15, což je 24 − 1 | 2 | BCD, reprezentace jednoho čísla | n/a | n/a | n/a | n/a | n/a |
8 | byte, octet | Se znaménkem: Od −128 do 127, od −(27) do 27 − 1 | 3 | ASCII znaky | int8_t, char | sbyte | Shortint | byte | tinyint |
8 | byte, octet | Bez znaménka: Od 0 do 255, což je 28 − 1 | 3 | ASCII znaky | uint8_t, char | 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-2 znaky | int16_t, short, int | short | Smallint | short | smallint |
16 | halfword, word, short | Bez znaménka: Od 0 do 65,535, což je 216 − 1 | 5 | UCS-2 znaky | uint16_t | ushort | Word | char | 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-32 znaky, Barevná hloubka s alphou, FourCC, ukazatele v 32bitovém programování | int32_t, int, long | int | LongInt; Integer | int | int |
32 | word, long, doubleword, longword, int | Bez znaménka: Od 0 do 4,294,967,295, což je 232 − 1 | 10 | UTF-32 znaky, Barevná hloubka s alphou, FourCC, ukazatele v 32bitovém programování | uint32_t | uint | LongWord; DWord; Cardinal | 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 od Unixového času), ukazatele v 64bitovém programování | int64_t, long, long long | long | Int64 | long | bigint |
64 | word, doubleword, longword, long long, quad, quadword, qword, int64 | Bez znaménka: Od 0 do 18,446,744,073,709,551,615, což je 264 − 1 | 20 | Čas(millisekundy od Unixového času), ukazatele v 64bitovém programování | 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 IPv6 adresa,GUIDs | C: pouze dostupné v nestandardních knihovnách pro specifické kompilátory | n/a | n/a | n/a | n/a |
128 | octaword, double quadword | Bez znaménka: Od 0 do 340,282,366,920,938,463,463,374,607,431,768,211,455, což je 2128 − 1 | 39 | Složité vědecké výpočty IPv6 adresa,GUIDs | C: pouze dostupné v nestandardních knihovnách pro specifické kompilátory | n/a | n/a | n/a | n/a |
n | n-bit integer (general case) | Se znaménkem: (−(2n−1)) do (2n−1 − 1) | ⌈(n − 1) log10 2⌉ | ⌈(n − 1) log10 2⌉ | Ada: rozsah -2**(n-1). +more2**(n-1)-1 | Ada: rozsah -2**(n-1). 2**(n-1)-1 | Ada: rozsah -2**(n-1). 2**(n-1)-1 | Ada: rozsah -2**(n-1). 2**(n-1)-1 | Ada: rozsah -2**(n-1). 2**(n-1)-1 |
n | n-bit integer (general case) | Bez znaménka: 0 do (2n−1) | ⌈n log10 2⌉ | ⌈n log10 2⌉ | 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. | 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. | 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. | 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. | 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. |
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í. +more Je běžné mít celočíselný typ, který má dvakrát tolik bitů než největší hardwarově podporovaný typ. Mnohé jazyky mají také typy bitových polí (určitý počet bitů, obvykle omezena tak, aby byla nižší než maximální hardwarově podporovaná šířka) a rozsahové typy (které mohou reprezentovat pouze celá čísla v zadaném rozsahu).
Některých jazyky, například Lisp, Smalltalk, REXX, Haskell, Python a Perl 6, podporují celá čísla s libovolnou přesností (známá jako celá čísla s nekonečnou přesností nebo bignums). 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. +more Mezi ně patří knihovny jako BigInteger v Javě nebo "bigint" balíček v Perl 5. 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.
Typ boolean nebo flag může představovat jen dvě hodnoty: 0 a 1, které se obvykle chápou jako nepravda (false) resp. pravda (true). +more 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 jako nibble (menší než kousnutí, angl. bite) nebo nybble (slovní hříčka na formu slova byte). +more Jeden nibble odpoví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
Termín bajt (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í po slovech). +more Termín bajt nebyl obvykle vůbec používán v souvislosti se stroji adresovanými po bitech či slovech.
Termín oktet se vždy vztahuje na rozsah 8-bitů a většinou se používá v oblasti počítačových sítí, kde umožňuje komunikaci počítačům s různými šířkami bajtu.
V moderním použití bajt téměř vždy znamená osm bitů, protože všechny ostatní velikosti se přestaly používat, takže bajt se stal synonymem pro oktet.
Slova
Výraz „slovo“ (anglicky word) se používá pro malou skupinu bitů, které procesor konkrétní architektury zpracovává najednou. Velikost slova je tedy specifická pro daný procesor. +more 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 od slova, jako dlouhé-slovo (longword), dvoj-slovo (doubleword), čtyř-slovo (quadword), a půl-slovo (halfword), se také mění podle použitého procesoru nebo operačního systému.
Prakticky všechny aktuální desktopové procesory (v roce 2017) jsou schopny používat 64bitová slova, i když jsou stále běžné procesory pro vestavě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, jako datový typ int, program nebude možné spustit na počítačích s 16bitovou šířkou datového typu integer. +more Taková proměnná by měla být deklarována jako long (který má alespoň 32 bitů na jakémkoliv počítači). Programátoři mohou také nesprávně předpokládat, že ukazatel (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
Krátký (short) integer můž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 jazyce C, je označován jako short. Je podmíněn šířkou alespoň 16 bitů a je často menší než standardní integer, ale to není nutné. +more Kompatibilní program může předpokládat, že lze bezpečné ukládání hodnoty mezi −(215−1) a 215−1, ale nesmí předpokládat že rozsah není větší. V Javě je short vždy 16bitové celé číslo. Ve Windows API je datový typ SHORT definována jako 16bitové celé číslo se znaménkem na všech strojích.
Běžné velikosti krátkého (short) integeru
Programovací jazyk | Platforma | Název datového typu | Znaménko | Rozsah v bajtech | Minimální hodnota | Maximální hodnota |
---|---|---|---|---|---|---|
C and C++ | Běžná implementace | short | Se znaménkem | 2 | −32,767 | +32,767 |
C and C++ | Běžná implementace | unsigned short | Bez znaménka | 2 | 0 | 65,535 |
C# | . +moreNET CLR/CTS | short | Se znaménkem | 2 | −32,768 | +32,767 |
C# | . NET CLR/CTS | ushort | Bez znaménka | 2 | 0 | 65,535 |
Java | Java platform | short | Se znaménkem | 2 | −32,768 | +32,767 |
Dlouhý (long) integer
Long integer může reprezentovat celé číslo, jehož rozsah je větší nebo rovnen standardnímu integeru na stejném stroji.
V C, je označován jako long. Musí mít alespoň 32 bitů, a může nebo nemusí být větší, než je standardní integer. +more V kompatibilní programu, lze předpokládat, že může bezpečně ukládat hodnoty mezi −(231−1) a 231−1, ale nemusí předpokládat, že rozsah není větší.
Běžné rozsahy long integeru
Programovací jazyk | Typ schválení | Platforma | Název datové typu | Rozsah v bajtech | Rozsah se znaménkem | Rozsah bez znaménka |
---|---|---|---|---|---|---|
C ISO/ANSI C99 | Mezinárodní standard | Unix, 16/32bitové systémy Windows, 16/32/64bitové systémy | 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) |
C ISO/ANSI C99 | Mezinárodní standard | Unix, 64bitové systémyMeyers, Randy (2000-12-01). | 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 (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 (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 | −2,147,483,648 do +2,147,483,647 | N/A |
VBA | Standard společnosti | Windows, Mac OS X | Long | 4 | −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#/ +moreNET'>VB. NET | ECMA Mezinárodní standard | Microsoft . NET | long or 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 |
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) |
Long Long
Ve C99 verzi programovacího jazyk C a C++11 verzi C++, je long long datový typ který má minimálně dvojí rozsah standardního long. 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. +more Pro ANSI/ISO kompatibilní kompilátory, jsou minimální požadavky na rozsah pro tento typ od −(263−1) do 263−1 pro typ se znaménkem a 0 264-1 pro typ bez znaménka . Tyto dva požadavky musí být splněny, nicméně rozšíření tohoto rozsahu je povoleno. 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ích platformně nezávislé rozsahy pro rozsahy datových typů. Standardní knihovna v C poskytuje stdint. h. Tato knihovna byla implementována v C99 a C++11.
Související články
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