C ++ 'da “uzun”, “uzun uzun”, “uzun int” ve “uzun uzun int” arasındaki fark nedir?


209

Java C ++ geçiş ve longveri türü hakkında bazı sorularım var . Java'da, 2 32'den büyük bir tamsayıyı tutmak için yazmanız yeterlidir long x;. Ancak, C ++ 'da long, hem bir veri türü hem de bir değiştirici olduğu görülmektedir.

Kullanmanın birkaç yolu var gibi görünüyor long:

long x;
long long x;
long int x;
long long int x;

Ayrıca, gibi şeyler var gibi görünüyor:

long double x;

ve bunun gibi.

Tüm bu çeşitli veri türleri arasındaki fark nedir ve hepsi aynı amaca mı sahiptir?



2
@ user2612743 - güvende olmak için gereksinimlerinizin ne olduğunu düşünün ve uygun türü kullanın. long longdaha yavaş olabilir, daha yavaş longolabilir int.
Pete Becker


1
Hayır, "güvende olmak için, uzun süre kullanmak" demek "güvende olmak için, sadece herkese bir dünya AIDS'i vermek demekle aynıdır, bu yüzden güvenli seks için endişelenmek zorunda değiliz, zaten her şeye sahibiz zaten!" Aptalca, değil mi? Verileri ve sahip olabileceği olası değerleri düşünün ve en uygun türü kullanın. Bu aynı zamanda, derleyicinin, hedef platformun doğal bit genişliğinden daha büyük sayıları işlemek için ek kitaplıklar yüklemesi gibi orijinal kod amacını bozmadan ek optimizasyonlar yapmasına yardımcı olur.
CM

Win32 liste kutuları ve benzerleri ile uzun süre kullanmak, sınırlarınızı ihlal etmese bile hafızanız ve diğer değişkenlerinizle tahribat vermeyecektir. Zararsız görünen C4244 uyarılarıyla bile tespit edilmesi kolay değildir.
Laurie Stearn

Yanıtlar:


182

longve long intözdeş. Yani vardır long longve long long int. Her iki durumda da int, isteğe bağlıdır.

İki set arasındaki farka gelince, C ++ standardı her biri için minimum aralıkları zorunlu kılar ve bu long longda en azından genişliktedir long.

Standardın kontrol parçaları (C ++ 11, ancak bu uzun zamandır var), birincisi 3.9.1 Fundamental types, bölüm 2 (daha sonraki bir bölüm, imzasız integral türleri için benzer kurallar verir):

Beş standart imzalı tamsayı türü vardır: imzalı karakter, kısa int, int, uzun int ve uzun uzun int. Bu listede, her tür, listede öncekinden daha az depolama alanı sağlar.

Ayrıca , bir bölümü aşağıda gösterilen 7.1.6.2 Simple type specifiersgerçek türlerle ( intisteğe bağlı olduğunu gösteren) belirteçlerin "eşlemelerini" gösteren bir tablo 9 da vardır :

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

Burada belirteç ve tür arasındaki farkı not edin. Belirtici, derleyiciye türün ne olduğunu nasıl söylediğinizdir, ancak aynı türden sonuç almak için farklı belirticiler kullanabilirsiniz.

Bu nedenle long, kendi başına soru türü olarak ne bir tür ne de bir değiştirici değildir , yalnızca long inttür için bir tanımlayıcıdır . İçin Ditto long longiçin bir belirleyici olma long long inttip.

C ++ standardının kendisi, integral türlerinin minimum aralıklarını belirtmese de 1.2 Normative references, uygulama olarak C99'dan bahseder . Dolayısıyla, belirtilen minimum aralıklar C99 5.2.4.2.1 Sizes of integer types <limits.h>uygulanabilir.


Açısından long double, aslında bir kayan nokta değeri yerine bir tamsayı var. İntegral türlerine benzer şekilde, en az a kadar hassasiyete sahip olmak ve doublebu tip üzerinde bir değerlerin üst kümesini sağlamak gerekir (yani en azından bu değerler, daha fazla değer değil ).


4
Aynı şey ile unsignedveunsigned int
Kal

2
Eminim longen az 32 bit (sıfırın her iki tarafında 2 ^ 31-1) ve long longen az 64 (her iki tarafta 2 ^ 63-1).
chris

2
Ve long doubleen azından menzile sahip olduğu garanti edilir double, ancak aynı olabilir. Bilgisayara bağlıdır. Bazı FPU'lar genişletilmiş hassasiyete sahiptir; x87 yongaları 32 bit tek duyarlık, 64 bit çift duyarlık ve 80 bit genişletilmiş hassasiyete sahipti.
Eric Jablow

Aralık gereksinimlerine gelince, C ++ 11 standardı, gerçek aralıkları olan C11 standardını referans alır.
chris

"İnt" bölümü, bir tamsayı türü ile kayan nokta, karakter veya diğer tamsayı olmayan tür arasında basit bir ayrım yapar. Birçok durumda, bu derleyici tarafından çıkarılabilir, bu yüzden bırakılabilir - Bu nedenle "imzasız", "imzasız int" ile aynıdır. "İnt" kısmı, programcı "char" veya "double" gibi başka bir şey belirtmedikçe varsayılır. Kullanılan gerçek boyutlara gelince .. okuduğunuz standarda bağlı olarak, her boyutta minimum bit sayısı olabilir, ancak bunların her biri en az bir önceki tip kadar büyük olacak şekilde tanımlanır .
CM


17

longeşittir long int, tıpkı shorteşittir short int. A long int, en az 32 bit olan işaretli bir integral tipidir, a long longveya long long intişaretli bir integral tipinde en az 64 bittir.

Bu mutlaka a'nın long longa'dan daha geniş olduğu anlamına gelmez long. Birçok platform / ABI LP64modeli long(ve işaretçilerin) 64 bit genişliğinde olduğu modeli kullanır . Win64 kullanan LLP64burada, longyine de 32 bittir ve long long(ve işaretçiler) genişliğinde 64 bittir.

Burada 64 bit veri modellerinin iyi bir özeti var .

long doubleen az a kadar geniş olacağını garanti etmez double.


7

Bu kafa karıştırıcı görünüyor çünkü longbir veri türü olarak alıyorsunuz .

longlong inttek başına kullandığınız zaman için kestirme bir şey değildir .

longbir değiştiricidir, doubleolarak da kullanabilirsiniz long double.

long== long int.

Her ikisi de 4 bayt alır.


Uzun süre 4 bayt Win64 için geçerlidir, platforma bağlıdır
Prodigle

1
Evet açıkçası ... sadece uzun değil ... int 4 bayt alır ve 2 bayt platforma bağlıdır, şüphesiz.
Siraj Alam

3

Tarihsel olarak, C başlarında, işlemcilerin 8 veya 16 bit kelime uzunluğuna sahip intolduğu günümüzde short(16 bit) aynıydı . Belli bir anlamda, int daha soyut veri türüdür char, short, longveya long longemin bitwidth hakkında olamaz gibi.

Bunu tanımlarken int n;bunu "bana n için bu makinede en iyi bit genişliği ve hızdan ödün ver" şeklinde çevirebilirsiniz. Belki gelecekte derleyicilerin int64 bit çevirmesini beklemelisiniz . Dolayısıyla, değişkeninizin 32 bit olmasını ve daha fazlasını istememesini istediğinizde, longveri türü olarak açık bir ifadeyi kullanmanız daha iyi olur .

[Edit: #include <stdint.h>henüz standardın bir parçası olmasa da, int ## _ t türlerini kullanarak bit genişliklerini sağlamanın doğru yolu gibi görünüyor.]


2
İnt 64 bit olduğunda 32 bit elde etmek için "uzun" kullanan bu son bölüm yanlıştır. İnt 64-bit ise, uzun da en az 64-bit olacaktır . Uzun, en azından int kadar büyük olduğu garanti edilir , ancak daha büyük olabilir, ancak asla daha küçük olmayabilir. Çoğu derleyici, programlayıcının daha spesifik olmasını sağlayan çeşitli yöntemlere sahiptir; örneğin, tam olarak 32 bit olan (taşınabilir olmayan) __int32 türü vb.
CM

1
C standardında tanımlandığı gibi long, a'nın en az 32 bit olduğu garanti edilir . (Standartlar zor değişebilir.) Mevcut C ++ 14 taslağı sadece şöyle diyor: @CM "Düz iç kısımlar, yürütme ortamının mimarisi tarafından önerilen doğal boyuta sahiptir, diğer işaretli tamsayı türleri özel ihtiyaçları karşılamak için sağlanmıştır" (bölüm 3.9.1 ). İçindeki çeşitli türlerin uzunluk ilişkileri hakkında hiçbir kelime bulamadım. __int32 gerçekten standardın bir parçası değil, ancak C ++ 11'den beri tam olarak ne istediğinizi elde etmek için int_fast32_t veya int_least32_t gibi typedef'ler var.
thomiel

Genel amaçlı yeniden programlanabilir mikrobilgisayarlar için yirminci yüzyıl uygulamalarında charneredeyse oybirliğiyle 8 bit, short16 ve long32 idi; intBazı platformlar (özellikle 68000) için hem 16 bit hem de 32 bit intoldukça yaygındı ve gerçekten de bazı derleyicilerin de destek seçenekleri vardı. Bu nedenle taşınabilir olması gereken kodun kullanılması shortya longda tercih edilmesi beklenmektedir int.
süper kedi

0

Java'da a longher zaman 64 bit iken , C ++ 'da bu bilgisayar mimarisine ve işletim sistemine bağlıdır . Örneğin, longLinux'ta 64 bit ve Windows'ta 32 bittir (bu, geriye dönük uyumluluğu sağlamak için yapıldı, 32 bit programların 64 bit Windows'da herhangi bir değişiklik yapmadan derlenmesine izin verdi).

İyi C ++ tarzı olarak kabul edilir Önlemek short int long ... ve kullanmak :

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

Bunlar ( int*_t), <cstdint>başlık eklendikten sonra kullanılabilir . size_tiçinde<stdlib.h> .

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.