tipos - ¿El estándar de C++ requiere que el máximo de los números enteros sin signo sea de la forma 2 ^ N-1?
numero mayor de un arreglo java (2)
C ++ especifica los rangos de los tipos integrales por referencia al estándar C. El estándar C dice:
Para los tipos de enteros sin signo distintos de los caracteres
unsigned char
, los bits de la representación del objeto se dividirán en dos grupos: bits de valor y bits 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 podrán representar valores de 0 a 2 N - 1 utilizando una representación binaria pura; Esto se conocerá como la representación del valor. Los valores de cualquier bit de relleno no están especificados.
Además, C ++ requiere:
Los enteros sin signo obedecerán las leyes del módulo aritmético 2 n donde n es el número de bits en la representación del valor de ese tamaño particular de entero.
Al juntar todo esto, encontramos que un tipo integral sin signo tiene n bits de valor, representa los valores en el rango [0, 2 n ) y obedece las leyes del módulo aritmético 2 n .
Para T
modo que el valor std::is_integral<T>::value && std::is_unsigned<T>::value
sea true
, el estándar C ++ garantiza que:
std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1
en el sentido matemático? Estoy buscando una prueba de eso basada en citas de la norma.
Creo que esto está implícito en [basic.fundamental]/4
(N3337):
Los enteros
unsigned
, declaradosunsigned
, obedecerán las leyes del módulo aritmético2^n
donden
es el número de bits en la representación del valor de ese tamaño particular de entero.