En un compilador de C de 16 bits, tenemos 2 bytes para almacenar un entero y 1 byte para un carácter. Para enteros sin signo, el rango es 0 a 65535. Para enteros con signo el rango es -32768 a 32767. Para carácter sin signo, 0 a 255. Según el tipo entero, ¿no debería el rango de caracteres con signo ser -128 a 127. Pero ¿Por qué -127 a 127? ¿Qué hay del resto?Confusión en el rango de tipos de datos de 16 bits
Respuesta
creo que va a mezclar dos cosas:
- Qué rangos de la norma requiere para
signed char
, etc.int
- Qué rangos son implementadas en la mayoría del hardware en estos días.
No es necesario que sean necesariamente iguales siempre que el rango implementado sea un superconjunto del rango requerido por la norma.
Según the C standard, los valores definido por la implementación de SCHAR_MIN
y SCHAR_MAX
será igual o mayor en magnitud (valor absoluto) a, y del mismo signo que:
SCHAR_MIN -127
SCHAR_MAX +127
es decir solamente 255 valores, no 256.
Sin embargo, los límites definidos por una implementación conforme pueden ser 'mayores' en magnitud que estos. es decir, [-128,+127]
también está permitido por la norma. Y como la mayoría de las máquinas representan números en el 2's complement form, [-128,+127]
es el rango que podrá ver más a menudo.
realidad, incluso el rango mínimo de int
definido por la norma C es simétrica aproximadamente cero. Es:
INT_MIN -32767
INT_MAX +32767
es decir sólo 65535 valores, no 65536.
Pero, de nuevo, la mayoría de las máquinas utilizan la representación 2's complement, y esto significa que ofrecen el rango [-32768,+32767]
.
Mientras que en 2's complement form es posible representar 256 valores firmados en 8 bits (es decir, [-128,+127]
), hay otras representaciones de números firmados donde esto no es posible.
En el sign-magnitude representation, un bit está reservado para la muestra, así:
00000000
10000000
ambos significan la misma cosa, es decir 0
(o más bien, +0
y -0
).
Esto significa, se pierde un valor. Y, por lo tanto, la representación de magnitud de signo solo puede contener valores de -127 (11111111
) a +127 (01111111
) en 8 bits.
En el one's complement representation (negar haciendo bit a bit NO):
00000000
11111111
ambos significan la misma cosa, es decir, 0
.
Nuevamente, solo los valores de -127 (10000000
) a +127 (01111111
) se pueden representar en 8 bits.
Si el estándar C requiere que el rango sea [-128,+127]
, esto esencialmente excluiría a las máquinas que usan tales representaciones de poder ejecutar programas C de manera eficiente. Necesitarían un bit adicional para representar este rango, por lo que necesitarían 9 bits para almacenar caracteres firmados en lugar de 8. La conclusión lógica basada en lo anterior es: Esta es la razón por la cual el estándar C requiere [-127,+127]
para los caracteres firmados. es decir, para permitir a las implementaciones la libertad de elegir una forma de representación entera que se adapte a sus necesidades y, al mismo tiempo, ser capaces de cumplir el estándar de una manera eficiente. La misma lógica se aplica al int
también.
- 1. profundidad de bits de 16 bits
- 2. Leer el rango de bits de la matriz de bytes
- 3. Convertir un int sin firmar de 16 bits a un int firmado de 16 bits en C#
- 4. Buscando el compilador x86 de 16 bits
- 5. Lectura en 16 bits de un registro de 32 bits
- 6. Numpy y PGM de 16 bits
- 7. Claro inferior 16 bits
- 8. escala de grises de 16 bits png
- 9. Conversión de punto flotante de 32 bits a 16 bits
- 10. Expresión regular - Rango (2-16)?
- 11. Recepción de enteros de 16 bits en Python
- 12. ¿Convertir bmp de 24 bits a 16 bits?
- 13. Direccionamiento de E/S de 16 bits indocumentado en Z80
- 14. Dibujando en un mapa de bits en escala de grises de 16 bits en la memoria
- 15. cadenas de C++: codificación UTF-8 o 16 bits?
- 16. Confusión entre asignaciones y tipos en ElasticSearch
- 17. Sustitución de un rango de bits
- 18. Conversión int a flotación de 16 bits (coma flotante de precisión media) en C++
- 19. manera más rápida de cambiar orden de bits en C# con palabras de 16 bits
- 20. cómo convertir dos bytes en un número de 16 bits?
- 21. muestras de audio de 8 bits a 16 bit
- 22. ¿Qué rango de valores pueden almacenar tipos enteros en C++
- 23. División de 64/32 bits en un procesador con división de 32/16 bits
- 24. por qué los campos de bits para los mismos tipos de datos tienen menos tamaño en comparación con los campos de bits para los tipos de datos mixtos
- 25. Confusión enum de Java con la creación de una máscara de bits y comprobación de permisos
- 26. numpy.array de un archivo de imagen "I; 16"
- 27. Visualización de imágenes en escala de grises de 16 bits en WPF
- 28. Tipos de datos SQLite
- 29. Almacenamiento de datos UTF-16/Unicode en SQL Server
- 30. ¿Qué significa OFFSET en el código de ensamblado de 16 bits?
Gracias por su explicación. –