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
.
Java nasıl insan okunabilir biçime bay...
Ölümcül Hata: Bellek Boyutu 134217728 ...
Nasıl bayt kısaltma kullanarak okunabi...
33554432 bayt bellek boyutu bitkin (43...
Bayt mysql int(11) sütun boyutu nedir?...