Tamsayı (bilgisayar bilimi) - Integer (computer science)
Bilgisayar bilimi, bir tamsayı bir olan veri arasında ayrılmaz bir veri türü , bir veri türü bazı temsil aralığını matematiksel bir tamsayı . İntegral veri türleri farklı boyutlarda olabilir ve negatif değerler içermesine izin verilebilir veya verilmeyebilir. Tamsayılar genellikle bir bilgisayarda bir ikili basamak (bit) grubu olarak temsil edilir. Gruplamanın boyutu değişir, bu nedenle kullanılabilir tamsayı boyutları kümesi farklı bilgisayar türleri arasında değişir. Bilgisayar donanımı neredeyse her zaman bir işlemci kaydı veya bellek adresini tamsayı olarak göstermenin bir yolunu sağlar .
Değer ve temsil
Değeri tamamlayıcı tip bir ürünün bu tekabül matematiksel tamsayıdır. İntegral türleri işaretsiz (yalnızca negatif olmayan tam sayıları temsil edebilen ) veya işaretli (negatif tam sayıları da temsil edebilen) olabilir.
Bir tamsayı değeri, tipik olarak , bir programın kaynak kodunda , isteğe bağlı olarak + veya - ile ön eki eklenen bir basamak dizisi olarak belirtilir . Bazı programlama dilleri, onaltılık (taban 16) veya sekizli (taban 8) gibi diğer gösterimlere izin verir. Bazı programlama dilleri ayrıca rakam grubu ayırıcılarına da izin verir .
İç temsil bu verinin değeri bilgisayarın belleğinde saklanan yoludur. Matematiksel tamsayılardan farklı olarak, bir bilgisayardaki tipik bir veri, bazı minimum ve maksimum olası değerlere sahiptir.
Bir pozitif tamsayının en yaygın temsili , ikili sayı sistemini kullanan bir bit dizisidir . Bitleri depolayan bellek baytlarının sırası değişir; bkz. endianness . Genişlik ya da hassas bir yekpare Çeşidi temsilinin bit sayısıdır. n bitlik bir integral türü 2 n sayıyı kodlayabilir ; örneğin, işaretsiz bir tür tipik olarak 0 ile 2 n -1 arasındaki negatif olmayan değerleri temsil eder . Tamsayı değerlerinin bit modellerine diğer kodlamaları bazen, örneğin ikili kodlu ondalık veya Gri kod veya ASCII gibi basılı karakter kodları olarak kullanılır .
İkili bir hesaplama sisteminde imzalı sayıları temsil etmenin iyi bilinen dört yolu vardır . En yaygın olanı, n bitli işaretli bir integral türünün -2 ( n −1) ile 2 ( n −1) −1 arasındaki sayıları temsil etmesine izin veren ikinin tümleyenidir . Orada mükemmel olduğu için ikiye tümleme aritmetik uygundur bire-bir yazışma beyan ve değerler arasındaki (özellikle de ayrı 0 ve -0) ve çünkü eklenmesi , çıkarma ve çarpma imzalı ve imzasız türleri birbirinden ayırt etmek gerekmez . Diğer olasılıklar arasında ofset ikili , işaret büyüklüğü ve birlerin tamamlayıcısı bulunur .
Bazı bilgisayar dilleri tamsayı boyutlarını makineden bağımsız bir şekilde tanımlar; diğerleri, temel işlemci kelime boyutuna bağlı olarak değişen tanımlara sahiptir. Tüm dil uygulamaları, tüm tamsayı boyutlarının değişkenlerini tanımlamaz ve tanımlanan boyutlar, belirli bir uygulamada farklı bile olmayabilir. Bir programlama dilindeki bir tamsayı, farklı bir dilde veya farklı bir işlemcide farklı boyutta olabilir.
Ortak integral veri türleri
bitler | İsim | Aralığı (varsayılarak iki tamlayıcısının için imzalanmış ) | Ondalık basamak | kullanır | Uygulamalar | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
C / C++ | C# | Pascal ve Delphi | Java | SQL | FORTRAN | NS | |||||
4
|
kemirmek , semioctet | İmza: -8'den 7'ye, −(2 3 )'den 2 3 − 1'e |
0.9
|
İkili kodlu ondalık , tek ondalık basamak gösterimi | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
İmzasız: 0'dan 15'e, bu da 2 4 − 1'e eşittir |
1.2
|
||||||||||
8
|
bayt , sekizli , i8, u8 | İmza: −128'den 127'ye, −(2 7 )'den 2'ye 7 − 1 |
2.11
|
ASCII karakterleri, kod birimleri içinde UTF-8 karakter kodlaması | int8_t , imzalı karakter | sbyte | kısa metin | bayt | minik | tamsayı(1) | bayt |
İmzasız: 0'dan 255'e, bu da 2 8 − 1'e eşittir |
2.41
|
uint8_t , imzasız karakter | bayt | Bayt | n/a | imzasız minik | n/a | ubyte | |||
16
|
yarım kelime , kelime , kısa, i16, u16 | İmza: -32.768'den 32.767'ye, −(2 15 )'den 2'ye 15 − 1 |
4.52
|
UCS-2 karakter, kod birimleri içinde UTF-16 karakter kodlaması | int16_t , kısa , int | kısa boylu | küçük | kısa boylu | küçük | tamsayı(2) | kısa boylu |
İmzasız: 0'dan 65.535'e, bu da 2 16 − 1'e eşittir |
4.82
|
uint16_t, imzasız , imzasız int | kısa | Kelime | karakter | imzasız küçük | n/a | kısa | |||
32
|
kelime, uzun , çift kelime, uzun kelime, int, i32, u32 | İmza: Dan -2,147,483,648 2,147,483,647 için gelen - (2 31 ) 2 31 - 1 |
9.33
|
UTF-32 karakter, alfa ile gerçek renk , FourCC , 32 bit bilgi işlemde işaretçiler | int32_t , int , uzun | int | UzunInt ; tamsayı | int | int | tamsayı(4) | int |
İmzasız: 0'dan 4,294,967,295'e kadar, bu da 2'ye eşittir 32 − 1 |
9.63
|
uint32_t, imzasız , imzasız int , imzasız uzun | uint | UzunKelime ; DWord ; Kardinal | n/a | imzasız int | n/a | uint | |||
64
|
kelime, çift kelime, uzun kelime, uzun uzun, dörtlü, dörtlü kelime, qword, int64, i64, u64 | İmza: −9,223,372,036,854,775,808 ila 9,223,372,036,854,775,807 , −(2 63 ) ila 2 63 − 1 |
18.96
|
Zaman ( Unix çağından bu yana geçen milisaniye ), 64 bit bilgi işlemde işaretçiler | int64_t , uzun , uzun uzun | uzun | Int64 | uzun | büyük | tamsayı(8) | uzun |
İmzasız: 0'dan 18,446,744,073,709,551,615'e kadar, bu da 2 64 − 1'e eşittir |
19.27
|
uint64_t , imzasız uzun uzun | uzun | UInt64 ; QKelime | n/a | imzasız bigint | n/a | uzun | |||
128
|
sekiz kelime, çift dört kelime, i128, u128 | İmza: −170,141,183,460,469,231,731,687,303,715,884,105.728 ila 170,141,183,460,469,231,731,687,303.715,884,105.727, −(2 127 ) ila 2 127 − 1 |
38.23
|
Karmaşık bilimsel hesaplamalar, | C: yalnızca standart olmayan derleyiciye özgü uzantı olarak kullanılabilir | n/a | n/a | n/a | n/a | tamsayı(16) | sent |
İmzasız: 0'dan 340.282.366.920.938.463.463.374.607.431.768.211.455'e kadar, bu da 2 128 − 1'e eşittir |
38.53
|
n/a | ucent | ||||||||
n
|
n -bit tamsayı (genel durum) |
İmzalı: −(2 n −1 ) ila (2 n −1 − 1) | ( n − 1) günlük 10 2 | Ada : aralık -2**(n-1)..2**(n-1)-1 | |||||||
İmzasız: 0 ila (2 n − 1) | n günlüğü 10 2 | Ada: aralık 0..2**n-1 , mod 2**n ; Python, C++, vb. gibi birçok dilde standart kitaplıkların veya üçüncü taraf keyfi aritmetik kitaplıklarının BigDecimal veya Decimal sınıfları. |
Farklı CPU'lar farklı integral veri türlerini destekler. Tipik olarak, donanım hem imzalı hem de imzasız türleri destekler, ancak yalnızca küçük, sabit bir genişlik kümesini destekler.
Yukarıdaki tablo, donanımda ortak işlemciler tarafından desteklenen tümleşik tip genişliklerini listeler. Üst düzey programlama dilleri daha fazla olanak sağlar. Donanım tarafından desteklenen en büyük türden iki kat daha fazla bit içeren bir 'çift genişlikli' integral türüne sahip olmak yaygındır. Pek çok dilde ayrıca bit alanı türleri (belirli sayıda bit, genellikle donanım tarafından desteklenen maksimum genişlikten daha az olacak şekilde sınırlandırılır) ve aralık türleri (yalnızca belirli bir aralıktaki tamsayıları temsil edebilir) vardır.
Lisp , Smalltalk , REXX , Haskell , Python ve Raku gibi bazı diller isteğe bağlı hassas tamsayıları destekler ( sonsuz hassas tamsayılar veya büyük sayılar olarak da bilinir ). Bu kavramı üst düzey bir yapı olarak desteklemeyen diğer diller, Java'nın BigInteger sınıfı veya Perl'in " bigint " paketi gibi daha küçük değişken dizilerini kullanarak çok büyük sayıları temsil eden kitaplıklara sahip olabilir . Bunlar, sayıları depolamak için bilgisayar belleğinin gerekli olduğu kadarını kullanır; bununla birlikte, bir bilgisayarın yalnızca sınırlı bir depolama alanı vardır, bu nedenle onlar da matematiksel tamsayıların yalnızca sonlu bir alt kümesini temsil edebilir. Bu şemalar çok büyük sayıları destekler, örneğin bir kilobayt bellek, 2466 ondalık basamağa kadar olan sayıları depolamak için kullanılabilir.
Bir Boole veya Bayrak 0 ve 1, genellikle ile özdeşleşmiş: türü sadece iki değeri temsil edebilir türüdür yanlış ve gerçek sırasıyla. Bu tür, tek bir bit kullanılarak bellekte saklanabilir, ancak adresleme kolaylığı ve erişim hızı için genellikle tam bir bayt verilir.
Dört bitlik bir miktar, nibble (yemek yerken, bir ısırıktan daha küçük ) veya nybble ( byte kelimesi biçiminde bir kelime oyunu ) olarak bilinir . Bir kemirme, onaltılık sistemde bir rakama karşılık gelir ve ikili kodlu ondalık sistemde bir rakamı veya bir işaret kodunu tutar.
Bayt ve sekizli
Bayt terimi başlangıçta 'en küçük adreslenebilir bellek birimi' anlamına geliyordu. Geçmişte 5-, 6-, 7-, 8- ve 9-bit baytların tümü kullanılmıştır. Tek tek bitleri ('bit adresli makine') adresleyebilen veya yalnızca 16- veya 32-bit miktarları ('kelime adresli makine') adresleyebilen bilgisayarlar da olmuştur. Bayt terimi genellikle bit ve kelime adresli makinelerle bağlantılı olarak hiç kullanılmadı.
Terimi, bir sekizli her bir 8-bit miktarını belirtir. Çoğunlukla , farklı bayt genişliklerine sahip bilgisayarların iletişim kurmak zorunda kalabileceği bilgisayar ağı alanında kullanılır .
Modern kullanımda bayt neredeyse her zaman sekiz bit anlamına gelir, çünkü diğer tüm boyutlar kullanım dışı kalmıştır; böylece bayt , oktet ile eşanlamlı hale geldi .
Kelimeler
'Kelime' terimi, belirli bir mimarinin işlemcileri tarafından aynı anda işlenen küçük bir bit grubu için kullanılır . Bir kelimenin boyutu bu nedenle CPU'ya özgüdür. 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 40-, 48-, 60- ve 64-bit dahil olmak üzere birçok farklı kelime boyutu kullanılmıştır. Mimari olduğundan, bir kelimenin boyutu , daha sonraki uyumlu bir CPU'nun özelliklerinden ziyade genellikle bir ailedeki ilk CPU tarafından belirlenir. Elde edilen terimlerin anlamları kelime gibi, longword , doubleword , quadword ve halfword da CPU ve işletim sistemi ile değişir.
Pratik olarak tüm yeni masaüstü işlemciler 64-bit sözcükleri kullanma yeteneğine sahiptir, ancak 8- ve 16-bit sözcük boyutuna sahip gömülü işlemciler hala yaygındır. 36-bit kelime uzunluğu bilgisayarların ilk günlerinde yaygındı.
Yazılımın taşınabilir olmamasının önemli bir nedeni, tüm bilgisayarların programcı tarafından kullanılan bilgisayarla aynı kelime boyutuna sahip olduğu şeklindeki yanlış varsayımdır. Örneğin, C dilini kullanan bir programcı, 2 15 -1'den büyük değerleri depolamak için kullanılacak bir değişkeni int olarak hatalı olarak bildirirse , program 16 bit tamsayılı bilgisayarlarda başarısız olur. Bu değişken , herhangi bir bilgisayarda en az 32 bit olan long olarak bildirilmelidir . Programcılar ayrıca, (bazı) 32 bit bilgisayarlarda çalışabilen, ancak 64 bit işaretçiler ve 32 bit tam sayılara sahip 64 bit bilgisayarlarda başarısız olan bir işaretçinin bilgi kaybı olmadan bir tam sayıya dönüştürülebileceğini yanlış bir şekilde varsayabilirler. Bu sorun, C99 tarafından stdint.h biçiminde .
intptr_t
Kısa tamsayı
Bir kısa tamsayı aynı makine üzerinde, standart bir tam sayı ile karşılaştırıldığında, daha küçük bir aralığa sahip olan ise, daha az depolama alanı alabilir bir tam sayı temsil edebilir.
Olarak C , o ile gösterilir kısa . En az 16 bit olması gerekir ve genellikle standart bir tam sayıdan daha küçüktür, ancak bu gerekli değildir. Uyumlu bir program, −(2 15 −1) ile 2 15 −1 arasındaki değerleri güvenli bir şekilde depolayabileceğini varsayabilir, ancak aralığın daha büyük olmadığını varsayamaz. In Java , bir kısa olduğu zaman 16 bit tam sayı. In Windows API , veri türü KISA tüm makinelerde 16 bit işaretli tamsayı olarak tanımlanır.
Programlama dili | Veri türü adı | imza | Bayt cinsinden boyut | En az değer | Maksimum değer |
---|---|---|---|---|---|
C ve C++ | kısa boylu | imzalı | 2 | -32.767 | +32.767 |
imzasız kısa | imzasız | 2 | 0 | 65.535 | |
C# | kısa boylu | imzalı | 2 | -32.768 | +32.767 |
kısa | imzasız | 2 | 0 | 65.535 | |
Java | kısa boylu | imzalı | 2 | -32.768 | +32.767 |
Uzun tamsayı
Bir uzun tamsayı bütün temsil tamsayı olan sınıfı için aynı makine üzerinde, standart bir tam sayı olduğu daha büyük veya ona eşittir.
Olarak C , o ile gösterilir uzun . En az 32 bit olması gerekir ve standart bir tamsayıdan daha büyük olabilir veya olmayabilir. Uyumlu bir program, −(2 31 −1) ile 2 31 −1 arasındaki değerleri güvenli bir şekilde depolayabileceğini varsayabilir, ancak aralığın daha büyük olmadığını varsayamaz.
Programlama dili | Onay Türü | Platformlar | Veri türü adı | Bayt cinsinden depolama | işaretli aralık | işaretsiz aralık |
---|---|---|---|---|---|---|
C ISO/ANSI C99 | Uluslararası Standart |
Unix ,16/32-bit sistemler Windows ,16/32/64-bit sistemler |
uzun | 4 (minimum gereksinim 4) |
-2,147,483,647 ile +2,147,483,647 arası | 0 - 4,294,967,295 (minimum gereklilik) |
C ISO/ANSI C99 | Uluslararası Standart |
Unix , 64 bit sistemler |
uzun | 8 (minimum gereksinim 4) |
−9,223,372,036,854,775,807 - +9,223,372,036,854,775,807 | 0 ila 18,446,744,073,709,551,615 |
C++ ISO/ANSI | Uluslararası Standart |
Unix , Windows , 16/32 bit sistem |
uzun | 4 (minimum gereksinim 4) |
-2,147,483,648 ile +2,147,483,647 arası |
0 - 4,294,967,295 (minimum gereklilik) |
C++/CLI | Uluslararası Standart ECMA-372 |
Unix , Windows , 16/32 bit sistemler |
uzun | 4 (minimum gereksinim 4) |
-2,147,483,648 ile +2,147,483,647 arası |
0 - 4,294,967,295 (minimum gereklilik) |
VB | Şirket Standardı | pencereler | Uzun | 4 | -2,147,483,648 ile +2,147,483,647 arası | Yok |
VBA | Şirket Standardı | Windows , Mac OS X | Uzun | 4 | -2,147,483,648 ile +2,147,483,647 arası | Yok |
SQL Server | Şirket Standardı | pencereler | BigInt | 8 | −9,223,372,036,854,775,808 - +9,223,372,036,854,775,807 | 0 ila 18,446,744,073,709,551,615 |
C# / VB.NET | ECMA Uluslararası Standardı | Microsoft .NET | uzun veya Int64 | 8 | −9,223,372,036,854,775,808 - +9,223,372,036,854,775,807 | 0 ila 18,446,744,073,709,551,615 |
Java | Uluslararası/Şirket Standardı | Java platformu | uzun | 8 | −9,223,372,036,854,775,808 - +9,223,372,036,854,775,807 | Yok |
paskal | ? | Windows , UNIX | int64 | 8 | −9,223,372,036,854,775,808 - +9,223,372,036,854,775,807 | 0 - 18,446,744,073,709,551,615 (Qword türü) |
Uzunca
In C99 sürümü C programlama dilinde ve C ++ 11 sürümü C ++ , bir long long
tür standart çift asgari kapasiteye sahip olduğunu desteklenmektedir long
. Bu tür, C++03'te uzun uzun tür bulunmadığından , C kodunun önceki C++ standardı C++03 ile uyumlu olmasını gerektiren derleyiciler tarafından desteklenmez . ANSI/ISO uyumlu bir derleyici için, belirtilen aralıklar için minimum gereksinimler, yani imzalı için −(2 63 −1) ila 2 63 −1 ve imzasız için 0 ila 2 64 −1 yerine getirilmelidir; ancak, bu aralığın genişletilmesine izin verilir. Bu, platformlar arasında kod ve veri alışverişi yaparken veya doğrudan donanım erişimi yaparken bir sorun olabilir. Bu nedenle, platformdan bağımsız tam genişlik türleri sağlayan birkaç başlık seti vardır. Cı standart kütüphane sağlar stdint.h ; bu, C99 ve C++ 11'de tanıtıldı.
Ayrıca bakınız
- Keyfi-hassas aritmetik
- İkili kodlu ondalık sayı (BCD)
- C veri türleri
- Tamsayı taşması
- İmzalı numara gösterimleri