Celé číslo (informatika) - Integer (computer science)
V informatice, an celé číslo je datum z integrální datový typ, a datový typ to představuje některé rozsah matematické celá čísla. Integrované datové typy mohou mít různé velikosti a může nebo nemusí mít záporné hodnoty. Celá čísla jsou v počítači běžně reprezentována jako skupina binárních číslic (bitů). Velikost seskupení se liší, takže sada dostupných celočíselných velikostí se liší mezi různými typy počítačů. Počítačový hardware, včetně virtuální stroje, téměř vždy představují způsob, jak reprezentovat procesor Registrovat nebo adresa paměti jako celé číslo.
Hodnota a reprezentace
The hodnota položky s integrálním typem je matematické celé číslo, kterému odpovídá. Integrální typy mohou být nepodepsaný (schopný reprezentovat pouze nezáporná celá čísla) nebo podepsaný (schopný reprezentovat také záporná celá čísla).[1]
Celočíselná hodnota je obvykle uvedena v zdrojový kód programu jako posloupnost číslic volitelně s předponou + nebo -. Některé programovací jazyky umožňují jiné notace, například hexadecimální (základ 16) nebo osmičkový (základ 8). Některé programovací jazyky také umožňují oddělovače skupin číslic.[2]
The interní reprezentace tohoto data je způsob, jakým je hodnota uložena v paměti počítače. Na rozdíl od matematických celých čísel má typický údaj v počítači určitou minimální a maximální možnou hodnotu.
Nejběžnějším vyjádřením kladného celého čísla je řetězec bity, za použití binární číselná soustava. Pořadí paměti bajtů ukládání bitů se liší; vidět endianismus. The šířka nebo přesnost integrálního typu je počet bitů v jeho reprezentaci. Integrální typ s n bity mohou kódovat 2n čísla; například nepodepsaný typ obvykle představuje nezáporné hodnoty 0 až 2n-1. Někdy se například používají jiné kódování celočíselných hodnot do bitových vzorů binárně kódované desetinné místo nebo Šedý kód, nebo jako kódy tištěných znaků, jako je ASCII.
Jsou čtyři známé způsoby, jak reprezentovat podepsaná čísla v binárním výpočetním systému. Nejběžnější je doplněk dvou, který umožňuje podepsaný integrální typ s n bity, které představují čísla od −2(n−1) přes 2(n−1)-1. Aritmetika komplementu dvou je pohodlná, protože existuje perfektní osobní korespondence mezi reprezentacemi a hodnotami (zejména bez samostatných +0 a −0) a protože přidání, odčítání a násobení nemusíte rozlišovat mezi podepsanými a nepodepsanými typy. Mezi další možnosti patří offset binární, velikost znaménka, a doplněk.
Některé počítačové jazyky definují celočíselné velikosti způsobem nezávislým na stroji; jiné mají různé definice v závislosti na velikosti slova v procesoru. Ne všechny jazykové implementace definují proměnné všech celočíselných velikostí a definované velikosti se nemusí v konkrétní implementaci ani lišit. Celé číslo v jednom programovací jazyk může mít jinou velikost v jiném jazyce nebo v jiném procesoru.
Běžné integrální datové typy
Bity | název | Rozsah (za předpokladu doplněk dvou pro podepsaný ) | Desetinná čísla | Použití | Implementace | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
C /C ++ | C# | Pascal a Delphi | Jáva | SQL[A] | FORTRAN | D | |||||
4 | okusovat, semioctet | Podepsaný: Od -8 do 7, od - (23) až 23 − 1 | 1 | Binárně kódované desetinné místo, reprezentace jedné desetinné číslice | n / a | n / a | n / a | n / a | n / a | n / a | n / a |
Nepodepsaný: Od 0 do 15, což se rovná 24 − 1 | 2 | ||||||||||
8 | byte, oktet, i8, u8 | Podepsaný: Od -128 do 127, od - (27) až 27 − 1 | 3 | ASCII postavy, kódové jednotky v UTF-8 Kódování znaků | int8_t, podepsaný znak[b] | sbyte | Shortint | byte | maličký | celé číslo (1) | byte |
Nepodepsaný: Od 0 do 255, což se rovná 28 − 1 | 3 | uint8_t, nepodepsaný znak[b] | byte | Byte | n / a | nepodepsaný tinyint | n / a | ubyte | |||
16 | půl slova slovo, krátké, i16, u16 | Podepsaný: Od -32 768 do 32 767, od - (215) až 215 − 1 | 5 | UCS-2 postavy, kódové jednotky v UTF-16 Kódování znaků | int16_t, krátký[b], int[b] | krátký | Smallint | krátký | smallint | celé číslo (2) | krátký |
Nepodepsaný: Od 0 do 65 535, což se rovná 216 − 1 | 5 | uint16_t, nepodepsáno[b], nepodepsané int[b] | ushort | Slovo | char[C] | nepodepsaný smallint | n / a | ushort | |||
32 | slovo, dlouho, dvojslovo, dlouhé slovo, int, i32, u32 | Podepsaný: Z −2 147 483 648 až 2 147 483 647, od - (231) až 231 − 1 | 10 | UTF-32 postavy, pravdivá barva s alfa, FourCC, ukazatele dovnitř 32bitové výpočty | int32_t, int[b], dlouho[b] | int | LongInt; Celé číslo[d] | int | int | celé číslo (4) | int |
Nepodepsaný: Od 0 do 4 294 967 295, což se rovná 232 − 1 | 10 | uint32_t, nepodepsáno[b], nepodepsané int[b], bez znaménka dlouho[b] | uint | LongWord; DWord; Kardinál[d] | n / a | nepodepsané int | n / a | uint | |||
64 | slovo, dvojslovo, longword, long long, quad, quadword, qword, int64, i64, u64 | Podepsaný: Od −9 223 372 036 854 775 808 do 9,223,372,036,854,775,807, od - (263) až 263 − 1 | 19 | Čas (milisekundy od Unixová epocha ), ukazatele v 64bitové výpočty | int64_t, dlouho[b], dlouho dlouho[b] | dlouho | Int64 | dlouho | bigint | celé číslo (8) | dlouho |
Nepodepsaný: Od 0 do 18 446 744 073 709 551 615, což se rovná 264 − 1 | 20 | uint64_t, bez znaménka dlouho dlouho[b] | dlouho | UInt64; QWord | n / a | nepodepsaný bigint | n / a | dlouho | |||
128 | octaword, dvojité čtyřslovo, i128, u128 | Podepsaný: Od -170 141 183 460 6069 231 731 687 303 715 884 105 728 do 170 141 183 460 469 231 731 687 303 715 884 105 727, od - (2127) až 2127 − 1 | 39 | Složité vědecké výpočty, | C: k dispozici pouze jako nestandardní rozšíření specifické pro kompilátor | n / a | n / a | n / a | n / a | celé číslo (16) | cent[E] |
Nepodepsaný: Od 0 do 340 282 366 920 938 463 463 374 607 431 768 211 455, což se rovná 2128 − 1 | 39 | n / a | ucent[E] | ||||||||
n | n-bit celé číslo (obecný případ) | Podepsaný: −(2n−1) až (2n−1 − 1) | ⌈(n - 1) log10 2⌉ | Ada: rozsah -2 ** (n-1) .. 2 ** (n-1) -1 | |||||||
Nepodepsaný: 0 až (2n − 1) | ⌈n log10 2⌉ | Ada: rozsah 0..2 ** n-1, mod 2 ** n; třídy BigDecimal nebo Decimal standardních knihoven nebo libovolných aritmetických knihoven třetích stran v mnoha jazycích, jako je Python, C ++ atd. |
Odlišný CPU podpora různých integrálních datových typů. Hardware obvykle bude podporovat podepsané i nepodepsané typy, ale pouze malou pevnou sadu šířek.
V tabulce výše jsou uvedeny šířky integrálních typů, které jsou v hardwaru podporovány běžnými procesory. Programovací jazyky na vysoké úrovni poskytují více možností. Je běžné mít integrální typ „dvojnásobné šířky“, který má dvakrát tolik bitů než největší typ podporovaný hardwarem. Mnoho jazyků také má bitové pole typy (zadaný počet bitů, obvykle omezený na menší než maximální šířka podporovaná hardwarem) a rozsah typy (které mohou představovat pouze celá čísla v zadaném rozsahu).
Některé jazyky, například Lisp, Pokec, REXX, Haskell, Krajta, a Raku Podpěra, podpora libovolná přesnost celá čísla (také známá jako nekonečná přesná celá čísla nebo bignums ). Jiné jazyky, které tento koncept nepodporují jako konstrukt nejvyšší úrovně, mohou mít k dispozici knihovny, které představují velmi velká čísla pomocí polí menších proměnných, jako je Java BigInteger třída nebo Perl „“bigint"balíček.[5] Využívají tolik paměti počítače, kolik je potřeba k uložení čísel; počítač má však jen konečné množství paměti, takže i ony mohou představovat pouze konečnou podmnožinu matematických celých čísel. Tato schémata podporují velmi velká čísla, například jeden kilobajt paměti lze použít k uložení čísel dlouhých až 2466 desetinných míst.
A Booleovský nebo Vlajka typ je typ, který může představovat pouze dvě hodnoty: 0 a 1, obvykle označené Nepravdivé a skutečný resp. Tento typ lze uložit do paměti pomocí jediného bitu, ale pro pohodlí adresování a rychlost přístupu se mu často dává celý bajt.
Čtyřbitová veličina je známá jako a okusovat (při jídle menší než a kousat) nebo nybble (být hříčkou v podobě slova byte). Jedno okusování odpovídá jedné číslici v hexadecimální a obsahuje jednu číslici nebo znakový kód v binárně kódovaném desítkovém čísle.
Bajty a oktety
Termín byte původně znamenalo „nejmenší adresovatelnou jednotku paměti“. V minulosti byly použity všechny 5-, 6-, 7-, 8- a 9bitové bajty. Existovaly také počítače, které dokázaly adresovat jednotlivé bity („bit-address machine“), nebo které dokázaly adresovat pouze 16- nebo 32-bitové množství („word-addresses machine“). Termín byte obvykle nebyl vůbec používán ve spojení se stroji s bitovou a slovní adresou.
Termín oktet vždy odkazuje na 8bitové množství. Většinou se používá v oblasti počítačové sítě, kde by počítače s různými šířkami bajtů mohly komunikovat.
V moderním použití byte téměř vždy znamená osm bitů, protože všechny ostatní velikosti již nebyly používány; tím pádem byte se stal synonymem pro oktet.
Slova
Pojem „slovo“ se používá pro malou skupinu bitů, které zpracovávají současně procesory konkrétního zařízení architektura. Velikost slova je tedy specifická pro CPU. Bylo použito mnoho různých velikostí slov, včetně 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 40-, 48-, 60- a 64bitových. Jelikož je architektonický, velikost a slovo je obvykle nastaven prvním CPU v rodině, spíše než charakteristikami později kompatibilního CPU. Významy termínů odvozených z slovo, jako dlouhé slovo, dvojslovo, čtyřslovo, a půl slova, také se liší podle CPU a OS.[6]
Prakticky všechny nové stolní procesory jsou však schopny používat 64bitová slova vestavěné procesory s 8 a 16bitovou velikostí slova jsou stále běžné. The 36bitová délka slova bylo v počátcích počítačů běžné.
Jednou z důležitých příčin nepřenosnosti 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 nesprávně deklaruje jako int proměnná, která se použije k uložení hodnot větších než 215−1, program selže na počítačích s 16bitovými celými čísly. Tato proměnná měla být deklarována jako dlouho, který má na libovolném počítači alespoň 32 bitů. Programátoři mohou také nesprávně předpokládat, že ukazatel lze převést na celé číslo bez ztráty informací, což může fungovat na (některých) 32bitových počítačích, ale selže na 64bitových počítačích s 64bitovými ukazateli a 32bitovými celými čísly. Tento problém je vyřešen C99 v stdint.h ve formě intptr_t
.
Krátké celé číslo
A krátké celé číslo může představovat celé číslo, které může trvat méně paměti, zatímco má menší rozsah ve srovnání se standardním celým číslem na stejném stroji.
v C, je označen krátký. Je vyžadováno, aby měl alespoň 16 bitů a je často menší než standardní celé číslo, ale není to nutné.[7][8] Vyhovující program může předpokládat, že může bezpečně ukládat hodnoty mezi - (215−1)[9] a 215−1,[10] ale nemusí předpokládat, že rozsah není větší. v Jáva, a krátký je vždy 16bitové celé číslo. V Windows API, datový typ KRÁTKÝ je definováno jako 16bitové celé číslo se znaménkem na všech počítačích.[6]
Programovací jazyk | Název datového typu | Podepsanost | Velikost v bajtů | Minimální hodnota | Maximální hodnota |
---|---|---|---|---|---|
C a C ++ | krátký | podepsaný | 2 | −32,767[F] | +32,767 |
bez znaménka krátký | nepodepsaný | 2 | 0 | 65,535 | |
C# | krátký | podepsaný | 2 | −32,768 | +32,767 |
ushort | nepodepsaný | 2 | 0 | 65,535 | |
Jáva | krátký | podepsaný | 2 | −32,768 | +32,767 |
Dlouhé celé číslo
A dlouhé celé číslo může představovat celek celé číslo jehož rozsah je větší nebo rovno standardnímu číslu na stejném stroji.
v C, je označen dlouho. Je vyžadováno, aby měl alespoň 32 bitů a může nebo nemusí být větší než standardní celé číslo. Vyhovující program může předpokládat, že může bezpečně ukládat hodnoty mezi - (231−1)[9] a 231−1,[10] ale nemusí předpokládat, že rozsah není větší.
Programovací jazyk | Typ schválení | Platformy | Název datového typu | Skladování v bajtů | Podepsaný rozsah | Nepodepsaný rozsah |
---|---|---|---|---|---|---|
C ISO / ANSI C99 | Mezinárodní standard | Unix, 16 / 32bitové systémy[6] Okna, 16/32 / 64bitové systémy[6] | dlouho[G] | 4 (minimální požadavek 4) | −2 147 483 647 až + 2 147 483 647 | 0 až 4 294 967 295 (Minimální požadavek) |
C ISO / ANSI C99 | Mezinárodní standard | Unix, 64bitové systémy[6][8] | dlouho[G] | 8 (minimální požadavek 4) | −9 223 372 036 854 775 807 až + 9 223 372 036 854 775 807 | 0 až 18 446 744 073 709 551 615 |
C ++ ISO / ANSI | Mezinárodní standard | Unix, Okna, 16 / 32bitový systém | dlouho[G] | 4 [12] (minimální požadavek 4) | −2 147 483 648 až + 2 147 483 647 | 0 až 4 294 967 295 (Minimální požadavek) |
C ++ / CLI | Mezinárodní standard ECMA-372 | Unix, Okna, 16 / 32bitové systémy | dlouho[G] | 4 [13] (minimální požadavek 4) | −2 147 483 648 až + 2 147 483 647 | 0 až 4 294 967 295 (Minimální požadavek) |
VB | Standard společnosti | Okna | Dlouho | 4 [14] | −2 147 483 648 až + 2 147 483 647 | N / A |
VBA | Standard společnosti | Okna, Mac OS X | Dlouho | 4 [15] | −2 147 483 648 až + 2 147 483 647 | N / A |
SQL Server | Standard společnosti | Okna | BigInt | 8 | −9 223 372 036 854 775 808 až + 9 223 372 036 854 775 807 | 0 až 18 446 744 073 709 551 615 |
C# / VB.NET | Mezinárodní standard ECMA | Microsoft .NET | dlouho nebo Int64 | 8 | −9 223 372 036 854 775 808 až + 9 223 372 036 854 775 807 | 0 až 18 446 744 073 709 551 615 |
Jáva | Mezinárodní / firemní standard | Java platforma | dlouho | 8 | −9 223 372 036 854 775 808 až + 9 223 372 036 854 775 807 | N / A |
Pascal | ? | Okna, UNIX | int64 | 8 | −9 223 372 036 854 775 808 až + 9 223 372 036 854 775 807 | 0 až 18 446 744 073 709 551 615 (typ Qword) |
Dlouhý dlouhý
V C99 verze Programovací jazyk C. a C ++ 11 verze C ++, a dlouho dlouho
je podporován typ, který má dvojnásobnou minimální kapacitu než standard dlouho
. Tento typ není podporován kompilátory, které vyžadují, aby byl kód C kompatibilní s předchozím standardem C ++, C ++ 03, protože dlouho dlouho typ v C ++ 03 neexistoval. U kompilátoru kompatibilního s ANSI / ISO platí minimální požadavky pro zadané rozsahy, tj. - (263−1)[9] až 263−1 pro podepsané a 0 až 264-1 pro nepodepsané,[10] musí být splněny; rozšíření tohoto rozsahu je však povoleno.[16][17] To může být problém při výměně kódu a dat mezi platformami nebo při přímém přístupu k hardwaru. Existuje tedy několik sad záhlaví poskytujících na platformě nezávislé typy přesné šířky. C. standardní knihovna poskytuje stdint.h; toto bylo představeno v C99 a C ++ 11.
Viz také
- Podepsané číselné reprezentace
- Binárně kódované desetinné místo, reprezentace celých čísel běžně používaných v sálových finančních aplikacích a v databázích
- Přetečení celého čísla
- Datové typy C.
Poznámky
- ^ Ne všechny dialekty SQL mají nepodepsané datové typy.[3][4]
- ^ A b C d E F G h i j k l m n Velikosti char, krátký, int, dlouho a dlouho dlouho v C / C ++ jsou závislé na implementaci jazyka.
- ^ Java přímo nepodporuje aritmetiku na char typy. Výsledky musí být vraceny zpět char z int.
- ^ A b Velikosti Delphi Celé číslo a Kardinál nejsou zaručeny, lišící se od platformy k platformě; obvykle definováno jako LongInt a LongWord resp.
- ^ A b Vyhrazeno pro budoucí použití. Zatím není implementováno.
- ^ Norma ISO C umožňuje implementacím rezervovat hodnotu se znaménkovým bitem 1 a všemi ostatními bity 0 (pro velikost znaménka a reprezentaci komplementu dvou) nebo se všemi bity 1 (pro doplněk těch) pro použití jako hodnota „trap“, která se používá k označení (například) přetečení.[9]
- ^ A b C d Podmínky dlouho a int jsou rovnocenné[11]
Reference
- ^ Cheever, Eriku. "Reprezentace čísel". Swarthmore College. Citováno 2011-09-11.
- ^ Madhusudhan Konda (02.09.2011). „Pohled na nové funkce prostředí Java 7 - O'Reilly Radar“. Radar.oreilly.com. Citováno 2013-10-15.
- ^ „Sybase Adaptive Server Enterprise 15.5: Přesné číselné datové typy“.
- ^ „Numerické datové typy MySQL 5.6“.
- ^ „BigInteger (Java Platform SE 6)“. Věštec. Citováno 2011-09-11.
- ^ A b C d E Mlha, Agner (2010-02-16). „Konvence volání pro různé překladače C ++ a operační systémy: Kapitola 3, Reprezentace dat“ (PDF). Citováno 2010-08-30.
- ^ Giguere, Eric (1987-12-18). „Standard ANSI: Souhrn pro programátora C“. Citováno 2010-09-04.
- ^ A b Meyers, Randy (2000-12-01). „The New C: Integrers in C99, Part 1“. drdobbs.com. Citováno 2010-09-04.
- ^ A b C d „ISO / IEC 9899: 201x“ (PDF). open-std.org. oddíl 6.2.6.2, odstavec 2. Citováno 2016-06-20.
- ^ A b C „ISO / IEC 9899: 201x“ (PDF). open-std.org. oddíl 5.2.4.2.1. Citováno 2016-06-20.
- ^ „ISO / IEC 9899: 201x“ (PDF). open-std.org. Citováno 2013-03-27.
- ^ „Základní typy v C ++“. cppreference.com. Citováno 5. prosince 2010.
- ^ „Kapitola 8.6.2 na straně 12“ (PDF). ecma-international.org.
- ^ Soubor nápovědy k VB 6.0
- ^ „Datové typy Integer, Long a Byte (VBA)“. microsoft.com. Citováno 2006-12-19.
- ^ Giguere, Eric (18. prosince 1987). „Standard ANSI: Souhrn pro programátora C“. Citováno 2010-09-04.
- ^ „American National Standard Programming Language C specifikuje syntaxi a sémantiku programů napsaných v programovacím jazyce C.“. Archivovány od originál dne 22. 8. 2010. Citováno 2010-09-04.