'#; 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
.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.
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.
Şamandıra Swift İnt dönüştürmek...
Doğru Twitter bootstrap şamandıra div...
Python tamsayı bölme üretir şamandıra...
JavaScript 2 basamağa bir şamandıra gö...
Sayısal,şamandıra arasındaki fark ve s...