Neden C yüzen bir bütün tamsayı değerleri temsil eden bir yüzer bir int teşvik ediyor?
Şu: var
int i = 23;
float f = 3.14;
if (i == f) // do something
i
float
bir terfi olacak ve float
iki sayı karşılaştırılır, ama bir float
int
tüm değerleri temsil edebilir? Neden int
double
float
hem teşvik değil mi?
CEVAP
int
integral promosyonlar unsigned
terfi olduğunda, negatif değerler de 0u < -1
doğru olmak için çok eğlenceli yol açar) kaybolur.
C En mekanizmaları gibi (C miras ), normal aritmetik dönüşümler donanım işlemleri açısından anlaşılmalıdır. Yapımcıları C çok tanıdık ile derleme dili makineleri ile çalıştılar ve yazdılar C yapmak için anında anlamda kendilerini ve insanların kendilerini zaman yazarları da bu zamana kadar hep yazılı Meclisi (gibi UNİX çekirdeği).
Şimdi, işlemciler, bir kural olarak, tipi karma talimatları (yüzer, int yüzer çift karşılaştırmak için ekleyin, vb.) gofret ... gayrimenkul büyük zaman kaybı olur, çünkü birçok kez farklı türlerini desteklemek için istediğiniz gibi daha fazla işlem uygulamak gerekiyor. Sadece senin için talimatları var "int int Ekle," "yüzer yüzer karşılaştırmak", "işaretsiz işaretsiz" vb. çarpma yapar ilk yerde, her zamanki aritmetik dönüştürmeleri gereken en mantıklı Yönerge aile için iki tür bir eşleme onları kullanmak için.
Gelen açımızdan birisi kullanılan yazılı düşük seviye makine kodu, karışık türler, çevirici talimatları sen büyük olasılıkla dikkate alınacak genel dava bunlar gerektirir en azından dönüşümleri. Bu durum özellikle ile kayan puan dönüşümler zamanı-pahalı, ve özellikle geri 1970'lerin başında, C Gelişmiş, Bilgisayar yavaş ve zaman kayan nokta hesaplamaları edildi yapılan yazılım. Bu gösterileri her zamanki gibi aritmetik dönüşümleri -- sadece bir işlenen hiç dönüştürülen (tek istisna long
/unsigned int
nerede long
dönüştürülebilir unsigned long
, gerektirmez bir şey yapılacak en makineleri. Belki de bu durum geçerlidir).
Bu yüzden, her zamanki aritmetik dönüşüm montaj kodlayıcı çoğu zaman ne yapacağını yazılır: bu, başka bir formda dönüştürmeyin bu iki tür var. Bu çevirici kod yazmak için kullanılan kim . aksi halde yapmak için özel bir nedeni vardı, ve insanların sürece çevirici kod ne yapacağınıyapınfarklı bir dönüşüm zorlamak için belirli bir nedenle, açıkça dönüşüm doğal bir talep var. Tüm bunlardan sonra, sadece yazabilirsiniz
if((double) i < (double) f)
İlginç not bu bağlamda, bu arada, bu unsigned
yüksek hiyerarşi daha int
, böylece karşılaştırma int
unsigned
sonunda işaretsiz karşılaştırma (dolayısıyla 0u < -1
bit başından beri). Sanıyorum bu bir gösterge bu insanlar eski zamanlarda kabul unsigned
daha az gibi bir kısıtlama int
daha bir uzantısı değeri aralığı: ihtiyacımız yok işareti şimdi kullanmaya başlayalım ekstra bit için daha büyük bir değer aralığı. Eğer int
16-bit int
s bir dünya taşması çok daha büyük bir dert olacağını beklemek nedenin varsa onu kullanacaksınız.
Neden bazı yüzer < karşılaştırmalar...
bir div içinde yüzen şeyler, div dışın...
Orada bir C# tamsayı bir Dizi temsil e...
Neden kullanmıyorsun ya da para birimi...
Bu nasıl bir dizi kontrol etmek için y...