SORU
4 EKİM 2012, PERŞEMBE


'#; C güvensiz' işlevi — *(şamandıra*)(&result) vs (şamandıra)(sonuç)

Herkes bunu basit bir şekilde kodlar aşağıda: açıklayabilir

public unsafe static float sample(){    
      int result = 154   (153 << 8)   (25 << 16)   (64 << 24);

      return *(float*)(&result); //don't know what for... please explain
}

Not:yukarıdaki kodu kullanırgüvensizişlevi

Yukarıdaki kod için, dönüş değeri arasındaki fark, dönüş değeri için aşağıda karşılaştırın. anlamıyorum çünkü zor zamanlar geçiriyorum

return (float)(result);

Eğer *(float*)(&result) dönen eğer güvensiz fonksiyonu kullanmak için gerekli mi?

CEVAP
4 EKİM 2012, PERŞEMBE


.float NET bir temsil IEEE binary32 tek duyarlıklı kayan sayı 32 bit kullanarak saklı kullanıyor. Görünüşe göre kod int içine bit araya getirerek bu sayıyı oluşturur ve sonra da float unsafe kullanarak çevirir. Döküm C açısından hiçbir dönüşüm döküm yapılır ne zaman yapılır reinterpret_cast denir - bit sadece yeni bir tür olarak tarihe geçti.

IEEE single precision floating number

Sayıyı onaltılık 4019999A ikili 01000000 00011001 10011001 10011010 monte:

  • Biti 0 (pozitif bir sayı).
  • Üs bit 10000000 (veya 128) üs elde edilir 128 - 127 = 1 (kesir= 2^1 2 çarpılır).
  • Kesir bit hiç değilse, sıfırlar ve birler tanınabilir bir desen var neredeyse 00110011001100110011010.

Kaydır döndü 2.4 kayan nokta dönüştürülür tam olarak aynı bit ve tüm işlevi sadece 2.4f literal tarafından değiştirilebilir.

Bir nevi "kısmını belki kaydır yazılı bir maç yapmaktır" edebi bir kayan nokta kullanarak? desen bit tatili son sıfır


Düzenli bir döküm ve garip arasındaki fark nedir""? güvensiz dökme yani

Aşağıdaki kodu varsayalım:

int result = 0x4019999A // 1075419546
float normalCast = (float) result;
float unsafeCast = *(float*) &result; // Only possible in an unsafe context

İlk döküm tamsayı 1075419546 alır ve kayan nokta gösterimi, 1075419546f örneğin dönüştürür. Bu işaret, üs ve kesir bit kayan noktalı sayı olarak özgün tamsayı temsil etmek için gerekli bilgi işlem içerir. Bu yapılması gereken önemsiz olmayan bir hesaplama.

İkinci döküm daha kötü ve güvensiz bir bağlamda yapılabilir). &result result tamsayı 1075419546 depolandığı konumu için bir işaretçi dönüş adresini alır. 22* *işaretçi kaldırma operatörü değer işaretçi tarafından işaret almak için kullanılabilir. Kullanma *&result alır tamsayı saklı yerinde ancak ilk döküm işaretçi float* (bir işaretçi float) bir kayan nokta yerine alınan gelen bellek konumu elde kaydır 2.4f varlık atanan unsafeCast. *(float*) &result anlatıresult bana kalemini ver ve işaretçi float bir işaretçi olduğunu kabul ve değer işaretçi tarafından işaret almak.

İlk dökme aksine ikinci cast herhangi hesaplamaları gerektirmez. Sadece 32 bit unsafeCast result saklanan neyse de 32 bit olan) uzerine.

Genel olarak böyle bir dökme sahne birçok açıdan başarısız olabilir ama unsafe kullanarak ne yaptığını biliyor musun derleyici söylüyorsun.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • CorridorDigital

    CorridorDigi

    17 Mayıs 2010
  • Evan Coury

    Evan Coury

    29 NİSAN 2007