De acuerdo con el estándar C/C++ (see this link), el operador >> en C y C++ no es necesariamente un desplazamiento aritmético para números con signo. Depende de la implementación del compilador si los 0 (lógico) o el bit de signo (aritmética) se desplazan a medida que los bits se desplazan hacia la derecha.Verificando que el desplazamiento a la derecha con signo C/C++ es aritmético para un compilador en particular?
¿Este código funcionará para ASSERT (error) en tiempo de compilación para compiladores que implementan un desplazamiento lógico a la derecha para enteros con signo?
#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);
¿Cuál es su compilación fallida para aquellos que tienen una máquina que usa un cambio lógico? ¿Por qué su software no va a ser utilizable en una máquina/compilador de este tipo? ¿No sería mejor escribir el código para que funcione independientemente de si el desplazamiento correcto de un número firmado es aritmético o lógico? –
Estoy usando la selección sin ramificación (BFS) a través del intercambio de bits. Requiere un cambio aritmético para funcionar. Estoy colocando el COMPILE_TIME_ASSERT (RIGHT_SHIFT_IS_ARITHMETIC); en el encabezado BFS. El código debe usar la definición RIGHT_SHIFT_IS_ARITHMETIC para seleccionar las rutas tradicionales o sin ramificaciones. Puede ser una aceleración masiva en la CPU de PS3/XBOX360 el uso de código sin ramificación debido a penalizaciones por errores de trazado de la bifurcación. – Adisak
BTW, la compilación fallida en un momento de compilación afirman que la razón se menciona explícitamente es mejor que simplemente tener el código misteriosamente fallado ... básicamente va a decir que estas rutinas no son compatibles con este compilador (o CPU). – Adisak