64 bit uzunluğa sahip bir int var. İkinci ve üçüncü baytlarda saklanan bir 16 bit imzalanmış int alıp 32 bitlik bir değere eklemem gerekir.C++, daha küçük türlere dökülürken kesiliyor
u32 Function(s32 value , u64 bitfield)
{
return value + (s16) (bitfield >> 8)
}
Ben genişlemeden önce bir 32 bitlik imzalı int için bir 16 bitlik işaretli int bit maskesini atmak derleyici güvenmek ve ek gerçekleştirir Can: Böyle bir şey kullanıyorum? Değilse, kalan baytları başka nasıl kırpmalı ve ihtiyacım olan tür dönüşümü nasıl yapmalıyım?
Bu çözüm istenmeyen bilgileri keserken, 16 bit işaretini korumaz. Aşağıdaki gibi bir şey kullanmayı düşünürdüm: dönüş değeri + ((s32) bit alanı << 8) >> 16); Bunun işe yarayacağını düşünürken, şaşırtıcı derecede çirkin buluyorum. – Limne
Tamam, imzayı korumak istediğiniz doğru nokta. Bununla birlikte, "çirkin" olmasına rağmen, niyetleriniz ne olduğu açık (bit özütleme) ve imzayı korur. Derleyici uygun talimatları seçmenin zor işini yapsın. Erken optimize etmeyin. –
Mutlaka gerekli olana kadar 'bitfield 'üzerinde' u64 'olarak imzayı korumak ve işlemleri korumak için güncellendi. –