Согласно стандарту C/С++ (см. эту ссылку), оператор → в C и С++ не обязательно является арифметическим сдвигом для подписанные номера. Реализация компилятора зависит от того, сдвинуты ли 0 (логические) или знаковый бит (арифметические), так как биты смещены вправо.
Будет ли этот код работать с ASSERT (fail) во время компиляции для компиляторов, реализующих логический сдвиг вправо для целых чисел со знаком?
#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 );