SORU
4 ŞUBAT 2013, PAZARTESİ


(-2147483648> 0) işlevi C doğru mu ?

-2147483648 32 bit tamsayı türünün küçük tamsayı, ama if(...) cümle taşma gibi görünüyor:

if (-2147483648 > 0)
    std::cout << "true";
else
    std::cout << "false";

Bu benim test true Baskı olacak. Eğer -2147483648 tamsayı için yayınlamadık, ancak sonuç çok farklı olacak:

if (int(-2147483648) > 0)
    std::cout << "true";
else
    std::cout << "false";

Bu false Yazdır.

Kafam karıştı. Kimse bu konuda bir açıklaması olan var mı?


Güncelleme 02-05-2012:

Yorum için teşekkürler, benim derleyici, int boyutu 4 bayt. Bazı basit testler için VC kullanıyorum. Benim söz konusu açıklama değiştirdim.

Bu yazı çok iyi replys bir sürü AndreyT derleyici böyle bir giriş davranışları hakkında çok detaylı bir açıklama yaptı ve bu minimum tamsayı uygulanmıştır. Diğer yandan qPCR4vir "merak" ve nasıl tamsayı temsil edilir. bazı ilgili verdi Çok etkileyici!

CEVAP
4 ŞUBAT 2013, PAZARTESİ


-2147483648 Bir "Numara". C dili olumsuz değişmez değerleri desteklemiyor.

-2147483648 aslında bir ifadesidir: olumlu bir edebi değeri 2147483648 önünde - operatör tekli ile. 2147483648 görünüşe göre olumlu tarafı için çok büyük değeri int platformda aralığı. Eğer 15 ** tür platform üzerinde daha fazla kapsama alanı olsaydı, derleyici otomatik olarak 2147483648 long int türü olduğunu varsayalım. (C 11 derleyici de long long int tür düşünmek gerekir.) Bu derleyici daha büyük tür etki -2147483648 değerlendirme yapacak ve sonuç tahmin edileceği gibi olumsuz olacaktır.

Ancak, görünüşe göre bu davayı Aralık long int aynı aralığı int ve genel yok tamsayı türü ile daha fazla kapsama alanı daha int platform. Bu resmen 2147483648 pozitif sabit taşmaları mevcut tüm sırayla programın davranışı tanımlı değil demektir tamsayı türleri, imzalı anlamına gelir. (Biraz dil belirtimi bir tanılama iletisi istemek yerine bu gibi durumlarda tanımsız davranış seçmesi, bu garip, ama öyle.)

Uygulamada, davranışı tanımsız olduğunu dikkate alarak, 2147483648 - uygulanan tekli ettikten sonra olumlu dönüş olur uygulama-bağımlı bazı negatif değer olarak yorumlanmış olabilir. Alternatif olarak, bazı uygulamalar, değerini göstermek için imzasız türleri örneğin, C89/90 derleyici unsigned long int ama C99 veya C kullanmak için gerekli () kullanmayı denemek için karar verebilirsiniz. Uygulamaları davranışı tanımlı zaten olduğu için bir şey yapmak için izin verilir.

Bir yan not olarak, bu INT_MIN gibi sabitleri tipik olarak tanımlanır nedeni de budur

#define INT_MIN (-2147483647 - 1)

yerine görünüşte daha basit

#define INT_MIN -2147483648

İkinci olarak tasarlanmıştır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • BaaaStuds's channel

    BaaaStuds's

    10 Mart 2009
  • New Challenger - Game Reviews

    New Challeng

    20 Temmuz 2006