2012-07-31 10 views
8

Llegué al punto en el que necesito comparar los valores con y sin signo. Hasta ahora, siempre modifiqué el código base para evitar esta situación por completo, pero ahora no puedo hacer eso.Manejando adecuadamente la comparación de los valores con signo y sin signo

Entonces, ¿cuál es la forma más adecuada de manejar la comparación chamuscada y sin firmar? Esta es una base de código mixto C/C++, por lo que mi pregunta se aplica a ambos idiomas.

Estoy revisando un recurso (firmado) contra el valor solicitado (sin firmar).

if (requested > resource.max) return Never; 
if (requested > resource.free - resource.assigned) return NotNow; 
return Now; 

Estaba pensando en algo como esto (sustituto C++ variantes en su caso):

if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return.... 
if ((signed)requested > resource.max) return Never; 
if ((signed)requested > resource.free - resource.assigned) return NotNow; 
return Now; 

¿estoy acercando a esto correctamente, o hay alguna manera mejor?

+0

¿Por qué se firmó su cuenta de recursos en primer lugar? –

+1

¿Qué tal 'resource.free

+1

O por qué se solicita sin firmar ya que ese es el valor que el OP parece tratar como firmado. De todos modos, este enfoque me parece bien. Este tipo de cosas es tan tedioso que tiendo a evitar los tipos sin firmar por completo. – jahhaj

Respuesta

9

Usted puede utilizar el código de una sola línea como punto de partida para hacerlo de forma segura:

bool GreaterSignedUnsigned(unsigned int u, signed int i) 
{ 
    // calculate the result of (u > i) 

    // if i is nonnegative it is safe to compare 2 unsigned values, 
    // otherwise unsigned int is always greater 
    return (i < 0) || (u > static_cast<unsigned int>(i)); 
} 

P. S. Es una buena práctica evitar las comparaciones combinadas de firma/no firma siempre que sea posible, ya que la comparación adicional y un reparto pueden causar una pérdida de rendimiento.

Cuestiones relacionadas