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 „ bigint ” Perla . 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.
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.
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 long
typ 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ż
- Arytmetyka z arbitralną precyzją
- System dziesiętny z kodowaniem binarnym (BCD)
- C typy danych
- Całkowitą przepełnienie
- Podpisane reprezentacje liczb