Todos los enteros tipos son diferentes, es decir, puede sobrecargar funciones de forma segura para todos ellos y no tendrá ningún conflicto. Sin embargo, algunas veces usan la misma cantidad de bits para su representación. Incluso si usan la misma cantidad de bits, los tipos firmados y sin firmar siempre tienen un rango diferente. Excepto por char
, usar cualquier tipo entero sin signed
es equivalente a usarlo con signed
, es decir, signed int
y int
son equivalentes. char
es un tipo diferente como signed char
y unsigned char
pero char
tiene la misma representación y rango de signed char
o . Puede usar std::numeric_limits<char>::is_signed
para averiguar cuál usa.
En los aspectos más interesantes. Las siguientes condiciones son ciertas:
7 <= std::numeric_limits<signed char>::digits
sizeof(char) == 1
sizeof(char) == sizeof(signed char)
sizeof(char) == sizeof(unsigned char)
15 <= std::numeric_limits<short>::digits
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
31 <= std::numeric_limits<long>::digits
sizeof(int) <= sizeof(long)
63 <= std::numeric_limits<long long>::digits
sizeof(long) <= sizeof(long long)
sizeof(X) == sizeof(signed X)
sizeof(signed X) == sizeof(unsigned X)
(donde "X" es una de char
, short
, int
, long
, y long long
).
Esto significa que el tamaño de todos tipos de enteros puede ser el mismo, siempre que este tipo tienen al menos 64 bits (y al parecer el Cray X-MP era tal bestia). En máquinas contemporáneas generalmente sizeof(int) == sizeof(long)
pero hay máquinas donde sizeof(int) == sizeof(short)
. Si long
es 32 o 64 bits depende de la arquitectura real y ambos tipos se encuentran actualmente.
En 'linux-amd64'' int' tiene 32 bits, mientras que 'long' tiene 64. –
Esto es intuitivamente obvio: ¿por qué el lenguaje quemaría una palabra clave para representar lo mismo? –
No puedo estar de acuerdo con esto. No siempre está idealmente libre de ambigüedad y redundancia. – qazwsx