2010-08-17 16 views
9

En limits.h, hay #defines para INT_MAX y INT_MIN (y SHRT_ * y LONG_ * y así sucesivamente), pero solo UINT_MAX.¿Qué es un valor portátil para UINT_MIN?

¿Debo definir yo mismo UINT_MIN? ¿Es 0 (cero positivo) un valor portátil?

+1

+1 por preocuparse lo suficiente acerca de la portabilidad y corrección para preguntar. –

+3

Debería dar un -1 por querer sin sentido eliminar el "número mágico" 0. Pero bueno. –

+1

"cero positivo"? – jamesdlin

Respuesta

2

Si quiere ser "seguro" puede usar 0U, por lo que si lo usa en una expresión tendrá las promociones correctas al unsigned.

+0

Entonces, ¿debería '#definir UINT_MIN + 0U' en' limits.h'? –

+1

Pensando en ello, tal vez no sea una buena idea tener un archivo que tenga el mismo nombre que un archivo estándar o perder el tiempo con el último. Lo pondría en otro lugar. Si quiere tener un '+' al '0U' (¿por qué?) Debería tener el entero entre paréntesis' (+ 0U) 'ya que de lo contrario podría tener efectos no deseados cuando el' + 'podría interpretarse como una suma. –

+0

No necesita paréntesis. Incluso en '1 + UINT_MIN', se expandiría a' 1+ + 0U', que es una expresión correcta. La expansión de macro ocurre al nivel de token, y no pega los dos más juntos. – MSalters

19

Es un entero sin signo -, por definición, su valor más pequeño posible es 0. Si desea alguna justificación, además de sentido común, el standard dice:

6.2.6.2 Los tipos enteros

  1. Para tipos de enteros sin signo distintos de unsigned char, los bits de la representación del objeto se dividirán en dos grupos: bits de valor y de relleno (no es necesario que haya ninguno de estos últimos). Si hay N bits de valor, cada bit representará una potencia diferente de 2 entre 1 y 2^(N -1), de modo que los objetos de ese tipo sean capaces de representar valores de 0 a 2^(N -1) usando una representación binaria pura; esto se conocerá como la representación del valor. Los valores de los bits de relleno no están especificados.
+3

adora el estándar. especialmente cuando está cotizado. –

+0

Esto no responde mi pregunta. –

+0

@Ariel, ¿cómo no responde su pregunta? El valor mínimo para un tipo sin signo está definido por el estándar como 0. –

7

Usted podría utilizar std::numeric_limits<unsigned int>::min().

+0

Esto no funcionará en C/C++. –

+2

Esto funcionará en C++, y esto no funcionará en C. ¿Qué es C/C++? –

+0

Nuestro árbol fuente contiene C y C++, por lo que debe funcionar con ambos. Es por eso que etiqueté la pregunta con ambos. –

Cuestiones relacionadas