veo que la respuesta 'correcta' ya se ha dado: Uso <limits>
y dejar que la magia suceda. Resulta que encontré esa respuesta insatisfactoria, ya que la pregunta es:
¿Sería realmente difícil escribir un método para calcular el límite de un tipo de variable?
La respuesta es: fácil para tipos enteros, hard for float types. Hay 3 tipos básicos de algoritmos que necesitarías para hacer esto. firmado, sin signo y punto flotante. cada uno tiene un algoritmo diferente para obtener el mínimo y el máximo, y el código real implica algunos giros, y en el caso del punto flotante, debe hacer un bucle a menos que tenga un tipo de entero conocido que sea del mismo tamaño que el flotador tipo.
Entonces, aquí está.
Unsigned es fácil. el mínimo es cuando todos los bits son 0, el máximo es cuando todos los bits son 1.
const unsigned type unsigned_type_min = (unsigned type)0;
const unsigned type unsigned_type_max = ~(unsigned type)0;
Para firmado, el min es cuando el bit de signo se establece pero todos los demás bits son ceros, el máximo es cuando se fijan todos los bits excepto el bit de signo. sin conocer el tamaño del tipo, no sabemos dónde está el bit de signo, pero podemos usar algunos trucos para que esto funcione.
const signed type signed_type_max = (signed type)(unsigned_type_max >> 1);
const signed type signed_type_min = (signed type)(~(signed_type_max));
para coma flotante, hay 4 límites, aunque knowning sólo los límites positivos es suficiente, los límites negativos simplemente están signo invertido límites positivos. Existe un potencial de muchas formas de representar números flotantes, pero para aquellos que usan puntos flotantes binarios (en lugar de base 10), casi todos usan representaciones IEEE.
Para flotantes IEEE, el valor de punto flotante positivo más pequeño es cuando el bit bajo del exponente es 1 y todos los demás bits son 0. El valor de punto flotante negativo más grande es el inverso a bit de esto. Sin embargo, sin un tipo entero que se sepa que tiene el mismo tamaño que el tipo de punto flotante dado, no hay ninguna forma de hacer esta manipulación de bit aparte de ejecutar un bucle. si tiene un tipo entero que sabe que tiene el mismo tamaño que su tipo de punto flotante, puede hacerlo como una operación única.
const float_type get_float_type_smallest() {
const float_type float_1 = (float_type)1.0;
const float_type float_2 = (float_type)0.5;
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ((byte*)&float_1)[ii]^((byte*)&float_2)[ii];
return u.fl;
}
const float_type get_float_type_largest() {
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
u.fl = get_float_type_smallest();
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ~u.ab[ii];
return -u.fl; // Need to re-invert the sign bit.
}
Creo que su respuesta es la más informativa, así que aquí hay un voto positivo y mis saludos! –
Estás asumiendo el cumplido de dos en enteros, que no es necesariamente cierto. La única forma portátil de obtener el valor máximo sin signo es '= -1', o algunos límites constantes. – GManNickG
@GMan: Los sistemas que no hacen las matemáticas de complementos de dos son teóricamente posibles, pero son una curiosidad histórica, no un problema de portabilidad genuino. –