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,

IPv6 adresleri, GUID'ler

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.

Ortak kısa tamsayı boyutları
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.

Ortak uzun tamsayı boyutları
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 longtü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

Notlar

Referanslar