2011-11-22 22 views
8

Si uno tiene que comparar int x con unsigned int y que es más seguro/mejor/más agradable en C99 y con gcc 4.4+:Compare int y unsigned int

  1. (unsigned int)x == y
  2. x == (int)y

qué es importante?

+0

Por lo general, no importa mucho, excepto en situaciones de desbordamiento (> = MAX_UINT/2, es decir, MAX_INT, es decir, 2 ** 31 en máquinas de 32 bits). –

+2

@BasileStarynkevitch: ¡Pero esto es aproximadamente el 50% de los valores posibles! ¿Qué podría importar más? –

+0

Estoy de acuerdo, pero con desbordamientos, la prueba realmente no tiene sentido natural ... (y la prueba sigue siendo la misma dentro de la máquina). Entonces todavía no importa ... el código de la máquina es más o menos el mismo ... –

Respuesta

16

más segura es comprobar que el número está dentro del rango antes de la colada:

if (x >= 0 && ((unsigned int)x) == y) 
+0

Gracias, ¿y está bien hacer '(int) y' cuando estamos seguros de que' y Cartesius00

+0

Sí, está bien, y probablemente sea más rápido escribir (y ejecutar, cuando el compilador no está optimizando) –

+0

No debe hacer el reparto y dejar que el compilador elija. Las reglas para "conversiones aritméticas habituales" son un poco complicadas, pero en esencia hay arquitecturas donde la conversión sería 'int' y otras donde la conversión sería 'unsigned', y por buenas razones. –

7

Sí, sí importa.

En una plataforma con 32bit int con p. Ej.

int x = -1; 
unsigned y = 0xffffffff; 

la expresión x == y cedería 1 porque a través de las "conversiones aritméticas habituales" el valor de x se convierte en unsigned y así 0xffffffff.

La expresión (unsigned int)x == y es 1 también. La única diferencia es que haces la conversión explícitamente con un elenco.

La expresión x == (int)y será muy probablemente 1 así porque la conversión de 0xffffffff a int rendimientos -1 en la mayoría de las plataformas (de dos negativos complemento). Estrictamente hablando, este es un comportamiento definido por la implementación y, por lo tanto, puede variar en diferentes plataformas.

Tenga en cuenta que en ninguno de los casos obtendrá el resultado "esperado" 0. Se proporciona una buena implementación en Mark Byers' answer.