Soru Uzun ve int veri türleri arasındaki fark [duplicate]


Bu sorunun zaten bir cevabı var:

Aşağıdaki ifadelerin geri döndüğü dikkate alınarak 4, arasındaki fark nedir int ve long C ++ cinsinden türler?

sizeof(int)
sizeof(long)

44
2018-05-22 22:17


Menşei


Soruldu ve cevaplandı: stackoverflow.com/questions/271076/... - Martin York


Cevaplar:


itibaren bu referans:

Bir int başlangıçta olması amaçlanmıştır   "doğal" kelime boyutu   işlemci. Birçok modern işlemciler   eşit ile farklı kelime boyutları ele   kolaylaştırmak.

Ayrıca, bu bit:

Birçok (ama hepsi değil) C ve C ++   uygulamalar, uzun bir   int Bugünün en popüler masaüstü   Windows ve Linux gibi platformlar,   öncelikle 32 bit işlemci ve   bu platformlar için çoğu derleyici   aynı boyuta sahip 32 bit int   ve uzun bir temsil.


51
2018-05-22 22:20



Bu referans nedir? Referansa erişilemiyor. Teşekkürler. - allenlinli


Standardın garantilediği garantiler şöyle:

1 == sizeof(char) <= sizeof(short) <= sizeof (int) <= sizeof(long) <= sizeof(long long)

Yani bu tam olarak geçerli sizeof (int) ve sizeof (long) eşit olmak ve birçok platform bu yaklaşımla gitmeyi tercih ediyor. Bazı platformlar bulacaksınız. int 32 bit, long 64 bit ve long long 128 bit, ama çok yaygın görünüyor sizeof (long) 4 olmak.

(Bunu not et long long C99'dan C99'dan itibaren tanınır, fakat normal olarak C ++ 11'den önce C ++'da bir uzantı olarak uygulanmıştır.)


40
2018-05-22 22:59



Bu yararlı bir bilgi bitidir. İşlemciler + derleyicileri vardır, burada (char)! = Sizeof (kısa). Detaylar şimdi biraz bulanıklaşıyor, ama üzerinde çalıştığım bir işlemcinin 16 bitten daha azını ele alabileceğine inanıyorum. Derleyici, makeeof (char) == 1 yapmak için çok fazla iş yapmak zorundaydı. - Craig Lewis
@CraigLewis: "... nerede" demek istiyorsun sizeof(char)==sizeof(short)", doğru mu? - Walter Tross
Bazı Cray makinelerinin olduğuna inanıyorum. sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int) && sizeof(int) == 1 ve bu boyut en az 32 bit idi. - Jonathan Leffler
Cray makineleri, özellikle Cray SV1 ilginçti. 8bit karakterleri vardı. Tek bir char ilan etmek, 64 bitlik bir kelimeyi kaplar ve biraz boşluk harcar. Bir yapıda bir dizi karakter veya çoklu karakter için derleyici otomatik olarak 8 bit karakterleri 64 bit kelimelerde toplar. char işaretçiler de diğer işaretçilerden daha büyüktü, onlar paketlenmiş char kelimesinin yanı sıra 64bit kelimesinin adresini saklamak zorundaydılar. - Raphael Addile


32 bitlik bir makinede veya 64 bit Windows makineniz var. 64-bit makinemde (Unix türevi O / S değil, Windows değil), sizeof(int) == 4, fakat sizeof(long) == 8.

Onlar farklı tipler - bazen birbirleriyle aynı büyüklükte, bazen değil.

(Gerçekten eski günlerde, sizeof(int) == 2 ve sizeof(long) == 4 - C ++ 'nın varolduğu günler olsa da, bunu düşünmeye gel. Yine de, teknik olarak, gömülü alanın dışında olağandışı bir durum olsa da ve gömülü alanda bile oldukça olağandışı bir şekilde, meşru bir yapılandırmadır.)


17
2018-05-22 22:21



Derleyicinin yanı sıra makineye de bağlı olduğunu unutmayın. MSVC'de 64 bit Windows'da bile (uzun) == 4. - Steve Jessop
Tabii ki - ama 64-bit Windows makinesi kullanmıyorum. Ama evet, "32-bit makinede iseniz" ifadem çok süpürüyor; "32-bit bir makinede ya da bir Windows makinesindesin" olabilirdi; - Jonathan Leffler
İlk ifadenin adil bir tahmin kadar yanlış olduğunu düşünmüyorum. İkincisi endişe ediyorum çünkü insanların derhal 8 bitlik bir süre olduğunu ve makinenizin 64 bitlik bir sonucu olarak derleyicinizin koşullu bir özelliği olduğunu düşünmelerine neden olabilir. - Steve Jessop
Birçok insan 64 bit pencerede. Bu, yanlış büyüklüğü verdiğiniz çok büyük bir grup insan sizeof(long)neredeyse hiç akıl almaz. Ben de Steve'le birlikteyim. - Cookie
@Cookie: 2009'da, çok daha az insan 64 bit Windows kullanıyordu. Bugünlerde, çok daha fazla kişi 64 bit Windows kullanıyor. - Jonathan Leffler


İkisinin de aynı boyuta sahip olduğu platformlarda cevap hiçbir şey değildir. Her ikisi de işaretli 4 bayt değerini temsil eder.

Bununla birlikte, bunun doğru olduğuna güvenemezsiniz. Uzun ve int büyüklüğü standart tarafından kesin olarak tanımlanmamıştır. Derleyicilerin farklı boyutlar vermesi ve dolayısıyla bu varsayımı bozması mümkündür.


4
2018-05-22 22:18





Uzun, en azından bir int ile aynı boyutta olmalı ve muhtemelen, fakat zorunlu olarak daha uzun olmalıdır.

Ortak 32 bit sistemlerde, hem int hem de uzun 4 bayt / 32 bittir ve bu C ++ özelliklerine göre geçerlidir.

Diğer sistemlerde, hem int hem de uzun uzunluk farklı bir boyutta olabilir. Int'nin 2 bayt olduğu ve 4 bayt uzunluğunda bir platform üzerinde çalışıyordum.


3
2018-05-22 22:23





Tipik bir en iyi uygulama doğrudan uzun / int / kısa kullanmıyor. Bunun yerine, derleyicilerin ve işletim sisteminin spesifikasyonlarına göre, tam olarak istediğiniz bit miktarını tuttuklarından emin olmak için bir başlık dosyasına sarın. Sonra uzun / int / kısa yerine int8 / int16 / int32 kullanın. Örneğin, 32bit Linux'ta böyle bir başlık tanımlayabilirsiniz

typedef char int8;
typedef short int16;
typedef int int32;
typedef unsigned int uint32;

2
2018-05-28 01:44



Bunları tanımlamaya gerek yoktur; Onlar zaten adlandırılmış bir Standart başlık dosyasına dahil <cstdint>, buraya bakın: en.cppreference.com/w/cpp/types/integer - jogojapan
@jogojapan evet, mümkünse daima standart tanımları tercih etmeliyiz. Ancak kod, eski bir OS / derleyicide derlemek için yeterli uyumluluğa ihtiyaç duyuyorsa, bu tür öğeleri elle kodlamak bunu sağlayacaktır. Her seçenek bazı mal ve kötüler var :) - fwlx