SORU
18 Ocak 2015, Pazar


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
18 Ocak 2015, Pazar


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 intnerede 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 ints bir dünya taşması çok daha büyük bir dert olacağını beklemek nedenin varsa onu kullanacaksınız.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011