maksimum tamsayı değeri


291

C'de, tamsayı (32 bit makine için) 32 bittir ve -32,768 ila +32,767 arasındadır. Java'da tamsayı (uzun) da 32 bittir, ancak -2.147.483.648 ile +2.147.483.647 arasında değişir.

Bit sayısı aynı olsa bile, aralığın Java'da nasıl farklı olduğunu anlamıyorum. Birisi bunu açıklayabilir mi?


35
Java'da int'in maks ve min değerlerini almak için Integer.MAX_VALUE ve Integer kullanın.MIN_VALUE
live-love

5
@stackuser - Sorunuza bazı iyi yanıtlar - birini kabul etmelisiniz :)
Darragh Enright

2
@DarraghEnright en son Mart 2015'te görüldü, geri döndüğünden şüpheliyim :(
Ungeheuer

4
@Adrian haha ​​- Sanırım hayır! Sanırım biraz olur. Her zaman SO'nun belirli koşullar altında cevapları kolayca otomatik olarak kabul edebileceğini hayal ettim - sorunun belirli bir yaşın üzerinde olduğu, OP AWOL ve çok sayıda upvotes ile açıkça yararlı bir cevap var.
Darragh Enright

2
@DarraghEnright Kabul Ediyorum. Ama OP buradaydı ~ 2 hafta önce, kabul etme şansı vardı, bu yüzden teknik olarak uzakta değil.
gaborsch

Yanıtlar:


394

In C , dil kendisi belli veritipinin temsilini belirlemez. Makineden makineye değişebilir, gömülü sistemlerde int16 bit genişliğinde olabilir, ancak genellikle 32 bit olabilir.

Tek gereklilik, boyutuna göre short int<= int<= olmasıdır long int. Ayrıca, intişlemcinin yerel kapasitesini temsil etmesi gereken bir öneri vardır .

Tüm tipler imzalanmıştır. unsignedDeğiştirici Eğer (aksi takdirde işaret biti için ayrılmıştır) değerinin bir parçası olarak, en yüksek bit kullanmasını sağlar.

Olası veri türleri için olası değerlerin kısa bir tablosu:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

In Java , Java Dil Şartname veri tiplerinin temsilini belirler.

Sıra: byte8 bit, short16 bit, int32 bit, long64 bit. Bu türlerin tümü imzalanmıştır , imzalanmamış sürümleri yoktur. Bununla birlikte, bit manipülasyonları sayılara imzasız gibi davranır (yani, tüm bitleri doğru şekilde işler).

Karakter veri türü char16 bit genişliğinde, imzasızdır ve UTF-16 kodlamasını kullanarak karakterleri tutar (ancak chargeçersiz bir karakter kod noktasını temsil eden rastgele bir imzasız 16 bit tam sayı atamak mümkündür )

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

10
C standardı ayrıca INT_MAX, LONG_MAX, vb. İçin minimum değerleri belirtir.
Oliver Charlesworth

13
Java 8 şimdi de imzasız bir Tamsayıya sahip
Jakub Kotowski

4
Teşekkürler, @jkbkot, bunu bilmek güzel. Temsilin hala imzalanmış gibi görünse de, bazı imzasız işlemler bir işlev olarak uygulanmaktadır. İki imzasız ints eklemek zor ...
gaborsch

5
@GaborSch Java'da, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));baskılar 2147483648ve karakter imzasız bir tür
howlger

2
@howlger Integer.MAX_VALUE + 1, 0x80000000taşma nedeniyle onaltılıktır (ve eşittir Integer.MIN_VALUE). İşaretsiz (uzun) olarak dönüştürürseniz, işaret bitine bir değer biti gibi davranılır 2147483648. charNot için teşekkürler . charimzasız, haklısın, ancak char gerçekten hesaplamalar için kullanılmıyor, bu yüzden onu listeden bıraktım.
gaborsch

73

C'de, tamsayı (32 bit makine için) 32 bittir ve -32768 ila +32767 arasında değişir.

Yanlış. 2'nin tamamlayıcı gösterimindeki 32 bit işaretli tam sayı -2 31 ila 2 31 -1 aralığındadır , bu da -2,147,483,648 ila 2,147,483,647'ye eşittir.


3
Üsünü düzelttim, **C bile değil ve bence çok net değil. :)
gevşeyin

2
Şimdi daha iyi görünüyor, teşekkürler! Sanırım çok fazla Python. ^Genellikle olduğundan kaçınırımxor
Kos

5
Demek istediğim, C'nin bir üs alma operatörü olmadığından, belirli bir parçanın kod olarak biçimlendirilmesi gerektiğini düşünmüyorum. :)
gevşeyin

19

32 bit tam sayı -2.147.483.648 ile 2.147.483.647 arasında değişmektedir. Ancak 32 bitlik bir makinede olmanız Cderleyicinizin 32 bitlik tamsayılar kullandığı anlamına gelmez .


1
En azından Bay Kernighan ve Bay Ritchies'in "C programlama dili" kopyam A4.2'de int32 bitlik makineler için derlerken 32 bit olarak yorumladığım "makinenin doğal genişliği" olduğunu söylüyor .
junix

7
Bu derleyiciye bağlıdır, inandığım makineye değil. Örneğin 64 bit makineme 16 bit derleyici yükledim.
Ivaylo Strandjev

Tabii ki 16 bit x86 kodu için 16 bit derleyiciniz sadece 16 bit kullandı. Ama bu benim görüşüm değildi. 16 bit modunda çalışan 32 bit x 86 işlemci bile yerel kapasiteye sahiptir ve yalnızca 16 bittir. Demek istediğim, derleyicinin hedeflediği platformun önemli olduğu. Örneğin, 80286'nız için bir derleyiciniz varsa, yine de 16 bit kod üreteceksiniz ve bu nedenle 16 bit tamsayılara sahip olacaksınız.
junix

2
@junix Cevabımda tam olarak bunu işaret ettiğime inanıyorum. Tamsayılarınızın kaç biti olduğunu belirten işletim sistemi değildir. Hedef platform, üzerinde çalıştığı işletim sisteminin veya işlemcinizin değil, derleyicinin bir özelliğidir.
Ivaylo Strandjev

İlk yorumumda yazdığım gibi. Msgstr "32 bit makineler için derlenirken 32 bit". OP, "tamsayı (32 bit makine için)"
mesajında ​​yazıyor

15

C dili tanımı , çeşitli veri türleri için minimum aralıkları belirtir . İçin int, bu minimum aralığı, yani, 32767 -32767 olan intolmalıdır en az 16 bit genişliğinde. Bir uygulama, intbuna karşılık gelen daha geniş bir aralığa sahip daha geniş bir tip sağlamakta serbesttir . Örneğin, üzerinde çalıştığım SLES 10 geliştirme sunucusunda aralık -2147483647 ila 2137483647'dir.

Hala 16 bit inttip kullanan bazı sistemler var (Tüm Dünya Bir VAX x86 Değil ), ancak 32 bit tip kullanan ve belki de 64 bit kullanan çok sayıda sistem var. int

C dili farklı mimarilerde çalışacak şekilde tasarlanmıştır. Java, bu mimari farklılıkları gizleyen sanal bir makinede çalışacak şekilde tasarlanmıştır.


16 bit int için -3276 8 ila 32767'dir. 32 bit int için -214748364 8 ila 2147483647'dir. Aralık -2 ^ (n bit-1) ile + 2 ^ (n bit-1) arasında belirtilir ) - 1.
efsanevi

3
@Maven: 5.2.4.2.1 - INT_MINolarak belirtilir -32767. İki kişinin tamamlayıcı olduğunu varsaymayın.
John Bode

8

Java'nın katı eşdeğeri C intcinsindendir long int.

Düzenleme: int32_tTanımlanmışsa, o zaman kesinlik açısından eşdeğerdir. long intjava'nın hassasiyetini garanti eder int, çünkü en az 32 bit boyutunda olması garanti edilir.


haklısın, eşdeğeri int32_tderleyiciniz tarafından tanımlanırsa
UmNyobe

7

Bunun nedeni, 32 bitlik makinedeki C - tamsayısında, 32 bitin saklanması için kullanıldığı anlamına gelmez, 16 bit de olabilir. Makineye bağlıdır (uygulamaya bağlı).


1
Peki, tipik uygulama davranışının "makine genişliği" kullandığını belirtmek gerekir int. Ama limits.htam olarak doğru olanın ne olduğunu bulmaya yardımcı olur
junix

3
Ama gerçekte, 32 bitlik bir C derleyicisinin 32 bit olarak int olmadan yapılmış olduğunu sanmıyorum. Standart, int'in derleyicinin uygulanmasının moronik bir yapıya sahip olmasına izin verebilir, ancak bazı nedenlerden dolayı kimse moronik bir C derleyicisi yapmak istemez. Eğilim yararlı C derleyicileri yapmaktır.
Lundin


4

Aslında bit boyut int, short, long derleyici uygulamasına bağlıdır.

Benim Ubuntu 64 Örneğin ben biraz shortiçinde 32başka bir 32 bit Ubuntu sürümü o zaman, bit 16bit.


1

__İnt32 için C aralığında –2147483648 ila 2147483647'dir . Tam aralıklar için buraya bakın.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

'İnt' değerinin 32 bit olacağının garantisi yoktur, belirli bir boyuttaki değişkenleri kullanmak istiyorsanız, özellikle bit manipülasyonları içeren kod yazarken, 'Standart Tamsayı Türlerini' kullanmalısınız.

Java dilinde

İnt veri türü 32-bit imzalı ikinin tamamlayıcı tamsayısıdır. Minimum değeri -2,147,483,648 ve maksimum değeri 2,147,483,647'dir (dahil).


2
C için teklif ettiğiniz değerler yalnızca minimum aralıklardır.
Oliver Charlesworth

@OliCharlesworth Minimumdan maksimuma kadar aralık.
Achintya Jha

6
Demek istediğim, her tür için aralığın yukarıda alıntıladığınızdan daha büyük olmasına izin verilir.
Oliver Charlesworth

3
C'de __int32 diye bir şey yoktur. Microsoft'un kesinlikle uyumlu C derleyicisi yoktur, bu yüzden C olmayan derleyicilerinin nasıl çalıştığını kim önemser? İlgili tek kaynak, 5.2.4.2.1 "Tamsayı tiplerinin boyutları" veya 7.20.2.1 "Tam genişlikteki tamsayı tiplerinin sınırları" olan ISO9899'dur. Bunların hiçbiri Microsoft goo ile uyumlu değildir.
Lundin

2
C99, standarda int32_t, int16_t vb. Ekler. Microsoft'un eklemeleriyle% 100 uyumlu değildir, ancak benzer şekilde çalışırlar.
Monica hakkında bilgi isteyin

1

Anlamak gerçekten çok basit, hatta google hesap makinesi ile hesaplayabilirsiniz: bir int için 32 bitiniz var ve bilgisayarlar ikili, bu nedenle bit (nokta) başına 2 değeriniz olabilir. 2 ^ 32 hesaplarsanız 4,294,967,296 elde edersiniz. yani bu sayıyı 2'ye bölerseniz (bunların yarısı negatif tamsayılar ve diğer yarısı pozitiftir), o zaman 2.147.483.648 elde edersiniz. ve bu sayı 32 bit ile temsil edilebilecek en büyük int, ancak dikkat ederseniz 2.147.483.648'in 2.147.483.647'den 1'den büyük olduğunu fark edeceksiniz, bunun nedeni sayılardan birinin tam olarak ortada olan 0'ı temsil etmesidir. 32 tek bir sayı değildir, bu nedenle ortada sadece bir sayı yoktur, bu nedenle negatif tamsayıların daha az bir şifresi vardır, negatifler ise tam yarıyı alır 2.147.483.648.

Ve bu kadar. Makinenin dile bağlı olmamasına bağlıdır.


2
İstediği bu değil ... soru "C int neden Java int'ten farklı?" Sorusudur.
ElectronWill

Ve Java'da boyutu makineye bağlı int değildir . int== 32 bitlik imzalı, two's-tamamlayıcı Java dili şartname ile tanımlanan, ve anodize levhalar üzerine kazınmıştır Unobtainium . (Tamam, belki de son bit değil.)
Stephen C

-1

C standardında, INT_MAX'ı maksimum 'int' değeri olarak kullanabilirsiniz, bu sabit "limit.h" de tanımlanmalıdır. Benzer sabitler diğer türler için de tanımlanır ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), belirtildiği gibi, bu sabit uygulamaya bağlıdır ancak minimum bitlere göre minimum değere sahiptir her tip için, standartta belirtildiği gibi.


5
Bu OP'nin sorusunu ele almaya pek yaklaşmıyor. Ayrıca, cevabın temel bölümleri başka bir siteye gömülmemelidir.
Brad Koch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.