C/C++ standardı (see this link)'a göre, C ve C++ içindeki >> işleç, zorunlu olarak imzalı sayılar için bir aritmetik kaydırma değildir. 0'ların (mantıksal) veya işaret biti (aritmetik) bitlerin sağa kaydırıldığı gibi kaydırılıp değiştirilmediği derleyici uygulamasına kalmıştır.C/C++ imzalı doğru kaymanın belirli bir derleyici için aritmetik olduğunu doğrulamak?
Bu kod, imzalı tamsayılar için mantıksal bir doğru kaydırmayı gerçekleştiren derleyiciler için derleme zamanında ASSERT (başarısızlık) işlevini yerine getirecek mi?
#define COMPILE_TIME_ASSERT(EXP) \
typedef int CompileTimeAssertType##__LINE__[(EXP) ? 1 : -1]
#define RIGHT_SHIFT_IS_ARITHMETIC \
((((signed int)-1)>>1) == ((signed int)-1))
// SHR must be arithmetic to use this code
COMPILE_TIME_ASSERT(RIGHT_SHIFT_IS_ARITHMETIC);
Mantıksal bir geçişi kullanan bir makineye sahip olanlar için başarısız derlemeniz nedir? Yazılımınız neden böyle bir makinede/derleyicide kullanılamayacak? Kodu yazmak daha iyi olmaz mı ki imzalanmış bir sayının doğru kayması aritmetik mi yoksa mantıksal mı? –
Bitsiz seçim yoluyla dalsız seçim (BFS) kullanıyorum. Çalışmak için aritmetik bir kayma gerektirir. COMPILE_TIME_ASSERT (RIGHT_SHIFT_IS_ARITHMETIC) koyuyorum; BFS başlığında. Kod, geleneksel veya dalsız yolları seçmek için RIGHT_SHIFT_IS_ARITHMETIC tanımını kullanmalıdır. Şube yanlış tahmin cezaları nedeniyle şube-serbest kod kullanmak için PS3/XBOX360 CPU'ların devasa bir hızlanma olabilir. – Adisak
BTW, bir derleme zamanında başarısız derleme, açık bir şekilde belirtildiği yerde, kodun gizemli bir şekilde başarısız olmasından daha iyidir ... temel olarak, bu rutinlerin bu derleyici (veya CPU) tarafından desteklenmediğini söyleyecektir. – Adisak