SORU
30 Mayıs 2013, PERŞEMBE


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
30 Mayıs 2013, PERŞEMBE


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.

http://ideone.com/4Adf97

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cristina Landa

    Cristina Lan

    28 Ocak 2010
  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • Wii Minute Radio

    Wii Minute R

    31 Mayıs 2008