Liczba całkowita (informatyka) - Integer (computer science)

W informatyce, całkowita to punkt odniesienia stanowi integralną typu danych , a typ danych , który reprezentuje pewną gamę matematycznych liczb całkowitych . Integralne typy danych mogą mieć różne rozmiary i mogą, ale nie muszą, zawierać wartości ujemne. Liczby całkowite są powszechnie reprezentowane w komputerze jako grupa cyfr binarnych (bitów). Rozmiar grupowania jest różny, więc zestaw dostępnych rozmiarów liczb całkowitych jest różny dla różnych typów komputerów. Sprzęt komputerowy prawie zawsze zapewnia sposób reprezentowania rejestru procesora lub adresu pamięci jako liczby całkowitej.

Wartość i reprezentacja

Wartość danej pozycji ze zintegrowanym typu jest liczbą całkowitą matematyczny, że odpowiada. Typy całkowite mogą być bez znaku (zdolne do reprezentowania tylko nieujemnych liczb całkowitych) lub ze znakiem (zdolne również do reprezentowania ujemnych liczb całkowitych).

Wartość całkowita jest zwykle określana w kodzie źródłowym programu jako sekwencja cyfr opcjonalnie poprzedzona + lub −. Niektóre języki programowania pozwalają na inne notacje, takie jak szesnastkowy (baza 16) lub ósemkowy (baza 8). Niektóre języki programowania dopuszczają również separatory grup cyfr .

Wewnętrzna reprezentacja tego odniesienia jest sposób wartość jest przechowywana w pamięci komputera. W przeciwieństwie do matematycznych liczb całkowitych, typowy układ odniesienia w komputerze ma pewną minimalną i maksymalną możliwą wartość.

Najpopularniejszą reprezentacją dodatniej liczby całkowitej jest ciąg bitów w systemie dwójkowym . Kolejność bajtów pamięci przechowujących bity jest różna; zobacz endianowość . Szerokość lub precyzji integralnego typu jest to liczba bitów w jego reprezentację. Typ całkowity z n bitami może zakodować 2 n liczb; na przykład typ bez znaku zazwyczaj reprezentuje wartości nieujemne od 0 do 2 n -1. Czasami używane są inne kodowania wartości całkowitych do wzorców bitowych, na przykład kod dziesiętny kodowany binarnie lub kod Graya lub jako kody znaków drukowanych, takie jak ASCII .

Istnieją cztery dobrze znane sposoby reprezentowania liczb ze znakiem w binarnym systemie obliczeniowym. Najpopularniejszym jest uzupełnienie do dwóch , które pozwala podpisanemu typowi całkowitemu z n bitami reprezentować liczby od -2 ( n -1) do 2 ( n -1) -1. Arytmetyka uzupełnień do dwóch jest wygodna, ponieważ istnieje idealna zgodność jeden do jednego między reprezentacjami i wartościami (w szczególności nie ma oddzielnych +0 i −0), a także ponieważ dodawanie , odejmowanie i mnożenie nie muszą rozróżniać typów ze znakiem i bez znaku . Inne możliwości obejmują offset binarny , znak-wielkość i dopełnienie jedynek .

Niektóre języki komputerowe definiują rozmiary liczb całkowitych w sposób niezależny od komputera; inne mają różne definicje w zależności od podstawowego rozmiaru słowa procesora. Nie wszystkie implementacje języka definiują zmienne o wszystkich rozmiarach liczb całkowitych, a zdefiniowane rozmiary mogą nawet nie być różne w konkretnej implementacji. Liczba całkowita w jednym języku programowania może mieć inny rozmiar w innym języku lub na innym procesorze.

Typowe integralne typy danych

Bity Nazwa Zakres (zakładając uzupełnienie do dwóch dla podpisanego ) Cyfry dziesiętne Zastosowania Realizacje
C / C++ C# Pascal i Delphi Jawa SQL FORTRAN D
4
skubać , semioktet Podpisany: Od -8 do 7, od −(2 3 ) do 2 3  − 1
0,9
Dziesiętny kodowany binarnie , reprezentacja jednej cyfry dziesiętnej nie dotyczy nie dotyczy nie dotyczy nie dotyczy nie dotyczy nie dotyczy nie dotyczy
Bez znaku: od 0 do 15, co równa się 2 4  − 1
1.2
8
bajt , oktet , i8, u8 Podpis: od -128 do 127, z - (2 7 ) i 2 7  - 1
2.11
Znaki ASCII , jednostki kodu w kodowaniu znaków UTF-8 int8_t , podpisany znak sbyte Skrót bajt maleńki liczba całkowita(1) bajt
Bez znaku: od 0 do 255, co równa się 2 8  − 1
2,41
uint8_t , znak bez znaku bajt Bajt nie dotyczy niepodpisany tinyint nie dotyczy ubyte
16
półsłowo, słowo , krótkie, i16, u16 Podpisano: Od −32 768 do 32 767, od −(2 15 ) do 2 15  − 1
4,52
UCS-2 znaki, jednostki kodu w kodowaniu znaków UTF-16 int16_t , krótki , int niski Smallint niski małyint liczba całkowita(2) niski
Bez znaku: od 0 do 65 535, co równa się 2 16  − 1
4,82
uint16_t, unsigned , unsigned int skrócić Słowo zwęglać unsigned smallint nie dotyczy skrócić
32
słowo, długie , podwójne słowo, długie słowo, int, i32, u32 Podpisano: od -2 147 483 648 do 2 147 483 647 , od - (2 31 ) do 2 31  - 1
9.33
Znaki UTF-32 , prawdziwy kolor z alfa, FourCC , wskaźniki w obliczeniach 32-bitowych int32_t , int , długi int LongInt ; Liczba całkowita int int liczba całkowita(4) int
Bez znaku: od 0 do 4 294 967 295, co równa się 2 32  − 1
9,63
uint32_t, unsigned , unsigned int , unsigned long nieskończoność Długie Słowo ; DWord ; Kardynał nie dotyczy niepodpisany nie dotyczy nieskończoność
64
word, doubleword, longword, long long, quad, quadword, qword, int64, i64, u64 Podpisano: od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 , od - (2 63 ) do 2 63  - 1
18,96
Czas (milisekundy od epoki Uniksa ), wskaźniki w obliczeniach 64-bitowych int64_t , długi , długi długi długie Int64 długie bigint liczba całkowita(8) długie
Bez znaku : od 0 do 18 446 744 073 709 551 615, co równa się 2 64  − 1
19.27
uint64_t , unsigned long long ulong UInt64 ; QSłowo nie dotyczy niepodpisany bigint nie dotyczy ulong
128
ośmiosłowo, podwójne czterosłowo, i128, u128 Podpisano: 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 105727, od - (2 127 ) do 2 127  - 1
38,23
złożone obliczenia naukowe,

Adresy IPv6 , identyfikatory GUID

C: dostępne tylko jako niestandardowe rozszerzenie specyficzne dla kompilatora nie dotyczy nie dotyczy nie dotyczy nie dotyczy liczba całkowita(16) cent
Bez znaku : od 0 do 340 282 366 920 938 463 463 374 607 431 768 211 455, co równa się 2 128  − 1
38,53
nie dotyczy centy
n
n -bitowa liczba całkowita
(przypadek ogólny)
Podpisany: −(2 n −1 ) do (2 n −1  − 1) ( n  − 1) log 10  2 Ada : zakres -2**(n-1)..2**(n-1)-1
Bez znaku: od 0 do (2 n − 1) n log 10  2 Ada: zakres 0..2**n-1 , mod 2**n ; Klasy BigDecimal lub Decimal bibliotek standardowych lub arbitralnych bibliotek arytmetycznych innych firm w wielu językach, takich jak Python, C++ itp.

Różne procesory obsługują różne typy danych integralnych. Zazwyczaj sprzęt obsługuje zarówno typy podpisane, jak i niepodpisane, ale tylko mały, stały zestaw szerokości.

W powyższej tabeli wymieniono integralne szerokości typów, które są obsługiwane sprzętowo przez popularne procesory. Języki programowania wysokiego poziomu dają więcej możliwości. Często zdarza się, że typ całkowity o podwójnej szerokości ma dwa razy więcej bitów niż największy typ obsługiwany sprzętowo. Wiele języków ma również typy pól bitowych (określoną liczbę bitów, zwykle ograniczoną do mniejszej niż maksymalna obsługiwana przez sprzęt szerokość) i typy zakresowe (które mogą reprezentować tylko liczby całkowite z określonego zakresu).

Niektóre języki, takie jak Lisp , Smalltalk , REXX , Haskell , Python i Raku obsługują liczby całkowite o dowolnej precyzji (znane również jako liczby całkowite o nieskończonej precyzji lub bignum ). Inne języki, które nie obsługują tej koncepcji jako konstrukcji najwyższego poziomu, mogą mieć dostępne biblioteki do reprezentowania bardzo dużych liczb przy użyciu tablic mniejszych zmiennych, takich jak klasa Java BigInteger lub pakiet „ bigintPerla . Wykorzystują one tyle pamięci komputera, ile jest konieczne do przechowywania liczb; jednak komputer ma tylko skończoną ilość pamięci, więc one również mogą reprezentować tylko skończony podzbiór matematycznych liczb całkowitych. Schematy te obsługują bardzo duże liczby, na przykład jeden kilobajt pamięci może służyć do przechowywania liczb o długości do 2466 cyfr dziesiętnych.

Typ Boolean lub Flag to typ, który może reprezentować tylko dwie wartości: 0 i 1, zwykle identyfikowane odpowiednio przez false i true . Ten typ może być przechowywany w pamięci przy użyciu pojedynczego bitu, ale często jest mu przydzielany pełny bajt dla wygody adresowania i szybkości dostępu.

Czterobitowa ilość jest znana jako skubnięcie (podczas jedzenia jest mniejsza niż kęs ) lub nybble (jako kalambur w formie słowa byte ). Jeden półbajt odpowiada jednej cyfrze w systemie szesnastkowym i zawiera jedną cyfrę lub kod znaku w postaci dziesiętnej kodowanej binarnie.

Bajty i oktety

Termin bajt początkowo oznaczał „najmniejszą adresowalną jednostkę pamięci”. W przeszłości używano wszystkich bajtów 5-, 6-, 7-, 8- i 9-bitowych. Istnieją również komputery, które mogą adresować poszczególne bity („maszyna adresowana bitowo”) lub adresy tylko 16- lub 32-bitowe („maszyna adresowana słownie”). Termin bajt zwykle nie był używany w odniesieniu do maszyn adresowanych bitowo i słownie.

Termin oktet zawsze odnosi się do liczby 8-bitowej. Jest używany głównie w dziedzinie sieci komputerowych , gdzie komputery o różnych szerokościach bajtów mogą się komunikować.

We współczesnym użyciu bajt prawie zawsze oznacza osiem bitów, ponieważ wszystkie inne rozmiary wyszły z użycia; w ten sposób bajt stał się synonimem oktetu .

Słowa

Termin „słowo” jest używany dla małej grupy bitów, które są obsługiwane jednocześnie przez procesory o określonej architekturze . Rozmiar słowa zależy więc od procesora. Zastosowano wiele różnych rozmiarów słów, w tym 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 40-, 48-, 60- i 64-bit. Ponieważ ma charakter architektoniczny, rozmiar słowa jest zwykle ustalany przez pierwszy procesor w rodzinie, a nie przez charakterystykę późniejszego zgodnego procesora. Znaczenie terminów wywodzących się z wyrazu , takich jak longword , doubleword , quadword i halfword , również różni się w zależności od procesora i systemu operacyjnego.

Praktycznie wszystkie nowe procesory do komputerów stacjonarnych mogą używać 64-bitowych słów, chociaż wbudowane procesory z 8- i 16-bitowymi rozmiarami słów są nadal powszechne. 36-bitowa długość słowa było powszechne w pierwszych dniach komputerów.

Jedną z ważnych przyczyn braku możliwości przenoszenia oprogramowania jest błędne założenie, że wszystkie komputery mają ten sam rozmiar słowa, co komputer używany przez programistę. Na przykład, jeśli programista za pomocą języka C niepoprawnie deklaruje jako int zmienna, który będzie używany do przechowywania wartości większej niż 2 15 -1, program nie działać na komputerach 16-bitowych liczb całkowitych. Ta zmienna powinna być zadeklarowana jako long , która ma co najmniej 32 bity na dowolnym komputerze. Programiści mogą również błędnie założyć, że wskaźnik można przekonwertować na liczbę całkowitą bez utraty informacji, co może działać na (niektórych) komputerach 32-bitowych, ale nie działa na komputerach 64-bitowych z 64-bitowymi wskaźnikami i 32-bitowymi liczbami całkowitymi. Ten problem został rozwiązany przez C99 w stdint.h w postaci intptr_t.

Krótka liczba całkowita

Krótki całkowitą może stanowić liczbę całkowitą, które mogą mieć mniej pamięci, gdy ma mniejszy zakres, w porównaniu ze standardowym całkowitą w tym samym urządzeniu.

W C oznacza się go skrótem . Musi być co najmniej 16 bitów i często jest mniejsza niż standardowa liczba całkowita, ale nie jest to wymagane. Program zgodny może założyć, że może bezpiecznie przechowywać wartości pomiędzy −(2 15 −1) a 2 15 −1, ale może nie zakładać, że zakres nie jest większy. W Javie , A short jest zawsze 16-bitowa liczba całkowita. W Windows API typ danych SHORT jest zdefiniowany jako 16-bitowa liczba całkowita ze znakiem na wszystkich komputerach.

Typowe krótkie rozmiary liczb całkowitych
Język programowania Nazwa typu danych Podpisanie Rozmiar w bajtach Minimalna wartość Maksymalna wartość
C i C++ niski podpisany 2 -32,767 +32 767
krótki bez znaku bez znaku 2 0 65 535
C# niski podpisany 2 −32 768 +32 767
skrócić bez znaku 2 0 65 535
Jawa niski podpisany 2 −32 768 +32 767

Długa liczba całkowita

Długo całkowita może stanowić całą liczbę całkowitą , której zasięg jest większa niż lub równa całkowitej standardowej na tej samej maszynie.

W C jest oznaczony przez long . Musi mieć co najmniej 32 bity i może być lub nie być większa niż standardowa liczba całkowita. Program zgodny może założyć, że może bezpiecznie przechowywać wartości pomiędzy −(2 31 −1) a 2 31 −1, ale może nie zakładać, że zakres nie jest większy.

Typowe rozmiary długich liczb całkowitych
Język programowania Rodzaj zatwierdzenia Platformy Nazwa typu danych Przechowywanie w bajtach Podpisany zakres Zakres bez znaku
C ISO/ANSI C99 Międzynarodowy standard Unix , systemy 16/32-bitowe
Windows , systemy 16/32/64-bitowe
długie 4
(minimalne wymaganie 4)
-2147483647 do +2147483647 0 do 4 294 967 295
(minimalne wymaganie)
C ISO/ANSI C99 Międzynarodowy standard Unix ,
systemy 64-bitowe
długie 8
(minimalne wymaganie 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 Międzynarodowy standard Unix , Okna ,
układ 16/32-bit
długie 4
(minimalne wymaganie 4)
-2147483648 do +2147483647
0 do 4 294 967 295
(minimalne wymaganie)
C++/CLI Międzynarodowa norma
ECMA-372
Unix , Okna ,
systemy 16/32-bitowe
długie 4
(minimalne wymaganie 4)
-2147483648 do +2147483647
0 do 4 294 967 295
(minimalne wymaganie)
VB Standard firmy Okna Długie 4 -2147483648 do +2147483647 Nie dotyczy
VBA Standard firmy Windows , Mac OS X Długie 4 -2147483648 do +2147483647 Nie dotyczy
Serwer SQL Standard firmy Okna 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 Międzynarodowy standard ECMA Microsoft .NET długi lub 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
Jawa Standard międzynarodowy/firmowy Platforma Java długie 8 -9 223 372 036 854 775 808 do +9 223 372 036 854 775 807 Nie dotyczy
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 (typ Qword)

Długie długie

W C99 wersji języka programowania C i C ++ 11 wersji C ++ , A long longtyp jest obsługiwany, że ma podwójne możliwości minimalnego standardu long. Ten typ nie jest obsługiwany przez kompilatory, które wymagają, aby kod C był zgodny z poprzednim standardem C++, C++03, ponieważ typ long long nie istniał w C++03. Dla kompilator ANSI / ISO zgodne, minimalnych wymagań określonych zakresach, to znaczy, - (2 63 -1) do 2 63 -1 podpisane i 0 do 2 64 -1 dla bez znaku musi być spełniony; jednak rozszerzenie tego zakresu jest dozwolone. Może to stanowić problem podczas wymiany kodu i danych między platformami lub bezpośredniego dostępu do sprzętu. W związku z tym istnieje kilka zestawów hederów zapewniających dokładne typy szerokości niezależnych od platformy. Biblioteka standardowa C udostępnia stdint.h ; zostało to wprowadzone w C99 i C++11.

Zobacz też

Uwagi

Bibliografia