(-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
-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.
Haskell işlevi kompozisyon (.) ve işle...
Tüm sonra, doğru geri Parçaları örnek ...
Nasıl yapmak .NET Windows Hizmeti doğr...
Değişkenleri içinde ve bir sınıf __dış...
php tırnak içe doğru (101) ...