Uzun uzun işaretsiz kaç bayttır?


84

Kaç bayttır unsigned long long? İle aynı unsigned long long intmı?


52
Sizeof (unsigned long long) yapın.
Ördek Komünist


2
C ve C ++ standartları, derleyicinin otomatik olarak seçtiği yöntemi geçersiz kılmak için içlerindeki sayılarla bir şeyler benimsemelidir. Float32, float64, int32 gibi bir şey, ihtiyacımız olan sınıra kadar, int256 veya float1024 ne olacak? ... bu gerçekten ağrıları
giderir

2
@gokoon: Ben cevap açıklandığı gibi, C standart zaten int32_t, uint64_tvb C ++ yaklaşan standart ile onları alacaksınız. Başlık içindeler <stdint.h>.
Fred Foo

1
float ve double ne olacak?
jokoon

Yanıtlar:


82

Yönetici özeti: 64 bit veya daha büyüktür.

unsigned long longile aynıdır unsigned long long int. Boyutu platforma bağlıdır, ancak C standardı (ISO C99) tarafından en az 64 bit olması garanti edilir. long longC89'da yoktu , ancak görünüşe göre MSVC bile destekliyor, bu yüzden oldukça taşınabilir.

Mevcut C ++ standardında (2003'te yayınlandı), long longbirçok derleyici bunu bir uzantı olarak desteklese de , yoktur . Yaklaşan C ++ 0x standardı bunu destekleyecek ve boyutu C ile aynı olacak, yani en az 64 bit.

İfade ile tam boyutu bayt (tipik platformlarda 8 bit) cinsinden alabilirsiniz sizeof(unsigned long long). Tam olarak 64 bit istiyorsanız uint64_t, başlıkta tanımlanmış olan ve <stdint.h>bir dizi ilgili türle birlikte kullanın (C99, C ++ 11 ve bazı güncel C ++ derleyicilerinde mevcuttur).


2
@lars: sizeof(char) tam olarak bir tane döndürme garantilidir . Bayt sayısı olarak işlenenin ne kadar büyük olduğunu döndürür, "karakter birimleri" sayısı değil. Bu nedenle, "çoğu platformda" baytları her platformda baytları değildir.
John Dibling

1
@John: bu bayt tanımına bağlıdır . Eşit charve bayt verirseniz, haklısınız. Eşit charve sekizli yaparsanız , o zaman değişir.
Fred Foo

4
@lars: Hayır, değil. Bir karakter her platformda her zaman tam olarak bir bayttır. Standart, bir baytta kaç bit olduğunu belirtmez, ancak bu farklı bir şeydir. Bir uygulama 64 bit bayt kullanabilir, bu da sonuçlanır sizeof(long long) == 1ve uyumlu olur.
John Dibling

1
@lars: Zaten size oy verdim, ama işte bir nitpick: "C standardı (ISO C99) tarafından garanti edilen en az 64 bit == 8 bayt" İçinde 64 bitlik gömülü olmayan bir dünya hayal edemiyorum! = 8 bayt, ancak Standart bunu garanti etmez.
John Dibling

@John: yine doğru. Zaten dil avukatı modunda olduğum için 64 bit == 8 bayt kaldırıldı. Ve aslında bir baytın 16 bit olduğu gömülü platformlar olduğunu duydum.
Fred Foo

17

C ++ 'nın güzelliği, C gibi, bu şeylerin boyutlarının uygulama tanımlı olmasıdır, bu nedenle kullandığınız derleyiciyi belirlemeden doğru cevap olamaz. Bu ikisi aynı mı? Evet. "long long", her ikisini de kabul eden herhangi bir derleyici için "long long int" ile eşanlamlıdır.


2
Söyledikleriniz teknik olarak doğru olsa da, standart en az 64 bit uzunluğunda olmasını gerektirir ve 64 bit dışında herhangi bir boyutu tanımlayan herhangi bir uygulamanın farkında değilim. Bu, 128 bitlik derleyiciler çıktığında değişebilir, ancak şu anki derleyiciler için 64 bit varsaymak çok da zor değildir.
Boaz Yaniv

2
+1, olumsuz oyu geri çeviriyor. Cevap, 'eşittir'in anlamına bağlıdır.
Andy Finkenstadt

3
@Andy: Bill Clinton? Sen olduğunu? ;)
John Dibling

4
Bu kesinlikle "C ++ 'nın güzelliği" değil, tam bir acı: p
asimes

@MichaelBurr 8 yıl sonra, hala hayatımda ne yaptığımı sorguluyorum, Rust'un zorunlu yazı büyüklükleriyle yaptıklarına en azından bunu yazan programcının bakış açısından olabildiğince yakınlaşmaya çalışıyorum. değişmez değerler, derleme zamanında. Hâlâ böyle bir şans yok. Bunun gibi şeyler saf ızdıraptan başka bir şey değildir.
Sahsahae

15

En az 64 bit olmalıdır. Bunun dışında uygulama tanımlıdır.

Kesin konuşmak gerekirse, unsigned long longC ++ 0x standardına kadar C ++ 'da standart değildir. unsigned long longtür için bir 'basit tür belirleyici'dir unsigned long long int(yani eşanlamlıdırlar).

long longTiplerinin seti C99 da ve hatta standardize edilmeden önce C ++ derleyici ortak bir uzantısı idi.


1
"Yakın zamanda onaylandı mı?" En son kontrol ettiğimde 2012'ye ertelemeyi düşünüyorlardı.
Fred Foo


1
@In silico: Bunu okudum. Ayrıca olası bir gecikme hakkında bir yerde okudum, ama gerçekten nerede olduğunu hatırlayamıyorum.
Fred Foo

1
@larsmans: FDIS ile ilgili resmi bir kaynak görmediğim sürece ("C ++ 0x FDIS gecikmesi" için yapılan bir arama motoru sorgusu bana ilgili isabet vermiyor), standardın 2011'de yayınlanmasını bekliyorum, ciddi sorunlar buna rağmen standardın kendisi.
In silico

1
@In silico: Ben de referansı bulamadım, bu yüzden sanırım ya bir söylenti ya da bir yanlış anlaşılmaydı. Yine de, FDIS statüsünün tam onay ile aynı olduğunu düşünmüyorum, değil mi?
Fred Foo

3

Operatörü kullanın, sizeofsize bayt cinsinden ifade edilen bir türün boyutunu verecektir. Bir bayt sekiz bittir. Aşağıdaki programa bakın:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
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.