1.25 m * geçirmeden C, boyutu operatör döner 8 bayt geçen 2.5 m ama 4 bayt 2
sizeof
operatör aşağıdaki sonuçlar üretiyor neden anlamıyorum:
sizeof( 2500000000 ) // => 8 (8 bytes).
... aşağıdaki yaptığımda: 8, ve döndürür
sizeof( 1250000000 * 2 ) // => 4 (4 bytes).
... 8 yerine 4, döner beklediğim gibi). Birisi sizeof
(veya veri tipi) ifade boyutunu belirler nasıl ve benim özel durumda bu neden oluşmasını açıklamak miyim?
En iyi tahminim sizeof
operatör derleme zamanlı bir operatördür.
Kelle Soru:Bu ifadeleri değerlendirmek ve beklenen benim çıkış (döküm) olmadan üretebileceği bir çalışma süresi operatör var mı?
CEVAP
2500000000
derleyici doğru yorumlar int
long
(ya da long long
ya uygun bir türü) gibi bir uyum yok. 1250000000
yok, 2
. sizeof
parametredeğil değerlendirdiderleyici çarpma sığmayan imkan yok yani , bir 16* *ve int
bir boyutunu verir.
Eğer parametre değerlendirildi olsa da, olası bir taşma (ve tanımsız davranış), ama muhtemelen hala 4
elde edersin.
Burada:
#include <iostream>
int main()
{
long long x = 1250000000 * 2;
std::cout << x;
}
çıkış tahmin edebilir misiniz? Eğer 2500000000
, sanıyorsan yanılıyorsun. Bu tür anlatım 1250000000 * 2
int
, çünkü işlenen int
int
ve çarpma değil otomatik olarak yüklenecektir terfi için daha büyük bir veri yazarsanız plana uymuyor.
Yani burada, gcc herhangi bir sayı olabilir ama tanımsız davranış -1794967296
, diyor. Bu sayıda uygun int
bir haline geliyor.
Ayrıca, eğer dökme bir işlenen için beklenen bir türü (gibi döküm tamsayılar zaman ayıran arıyorsan tamsayı olmayan bir sonuç), göreceksin ki bu çalışma:
#include <iostream>
int main()
{
long long x = (long long)1250000000 * 2;
std::cout << x;
}
verimleri doğru 2500000000
.
C boolean boyutu ne#? Gerçekten 4-bayt...
Nasıl bayt kısaltma kullanarak okunabi...
Shell dosya boyutu (bayt olarak) almak...
Boyutu c bayt nesne örneği bul#...
Bayt mysql int(11) sütun boyutu nedir?...