ios - informatica - que es un kilobyte
Tantas formas de definir un byte (2)
Como en todos los lenguajes de programación derivados del modelo tipo lenguaje C, Objective C tiene un puñado de opciones equivalentes para declarar un entero de 8 bits.
¿Por qué dije equivalente? Debido a que, como OP declaró correctamente, es obvio que todas esas opciones eventualmente se typedef
al tipo de compilador incorporado de unsigned char
. Esto es correcto por ahora y, hablemos en la práctica, nadie sensato los cambiará para ser un número entero que no sea de 8 bits en el futuro.
Entonces, la pregunta real aquí es ¿cuál es el mejor orden para priorizar las consideraciones al elegir el nombre de tipo para el entero de 8 bits?
Legibilidad del código
Dado que básicamente en todos los códigos que tienen raíces en lenguaje C
, los nombres de tipos primitivos son un desastre. Por lo tanto, probablemente el factor más importante es la legibilidad . Y me refiero a la intención clara y únicamente identificable de elegir este tipo específico para este entero específico para la mayoría de las personas que leerían su código.
Así que echemos un vistazo a esos tipos desde un punto de vista promedio de programador de Objective C que sabe poco sobre el lenguaje C.
-
unsigned char
- ¿qué es esto? ¿Por qué char está destinado a ser firmado? -
uint8_t
- ok, entero de 8 bits sin signo -
UInt8
- hmm, lo mismo que arriba -
Byte
- entero de 8 bits con o sin signo -
Bytef
- ¿Qué es esto? byte-float? ¿Qué significa esa ''f''?
Es obvio que las Bytef
unsigned char
y Bytef
no son una buena elección.
Yendo más allá, puede notar otra molestia con el nombre de tipo Byte
: no puede decir con seguridad si representa un entero con unsigned
o unsigned
signo, lo que podría ser extremadamente importante cuando se trata de entender cuál es el rango de valores que este entero podría contener ( -128 .. 127 o 0 ... 256). Esto no está agregando puntos a la legibilidad del código, también.
Estilo de código uniforme
Ahora nos quedamos con los 2 nombres de tipo: uint8_t
y UInt8
. ¿Cómo elegir entre ellos?
Nuevamente, mirándolos a través de los ojos de un programador de Objective C, que usa nombres NSUInteger
como NSInteger
, NSUInteger
mucho, parece muy natural cuando ve UInt8
. uint8_t
solo se ve como una cosa desalentadora de muy bajo nivel.
Conclusión
Por lo tanto, finalmente nos quedamos con la opción única - UInt8
. Lo cual es claramente identificable en términos de número de bits, rango y apariencia acostumbrados. Así que probablemente sea la mejor opción aquí.
¿Hace una diferencia cuál uso en object-c (particularmente en iOS)? Supongo que se debe a la herencia de C y sus tipos, así como a los tipos de Mac OS en los que se basó iOS, pero no sé cuál debería usar:
unsigned char
de ... bueno ... el compilador?
uint8_t
de stdint.h
UInt8
de MacTypes.h
Byte
de MacTypes.h
Bytef
de zconf.h
Soy consciente de que las diversas definiciones son por motivos de portabilidad, y el uso de literales como unsigned char
no es una buena idea para el futuro (el tamaño puede cambiar y las cosas terminarán como la API de Windows nuevamente). Me gustaría un consejo sobre cómo encontrar los mejores para mi uso. O un buen azote de lengua si solo estoy siendo tonto ...
EDITAR : Solo para obtener más información, si quiero algo que siempre será de 1 byte, ¿debería usar uint8_t (no parece que cambie con un nombre así)? Me gustaría pensar que UInt8 tampoco cambiaría, pero veo que la definición de UInt32 varía según si el procesador es de 64 bits o no.
EDICIÓN ADICIONAL : Cuando digo byte, específicamente quiero decir que quiero 8 bits. Estoy realizando operaciones de compresión de píxeles (32 bits -> 8 bits) para el almacenamiento en disco.
Es totalmente indiferente. Cualquiera que uses, lo más probable es que termine siendo un unsigned char
. Sin embargo, si quieres que se vea bien, te sugiero que uses uint8_t
de <stdint.h>
.
Tampoco cambiará con la arquitectura. char
es siempre de 1 byte según el estándar de C, y sería insostenible desde el punto de vista del usuario si en una implementación, UInt8 de repente tuviera 16 bits de longitud.
(No es el caso, sin embargo, se requiere que el char
sea de 8 bits de ancho, es solo que si el nombre de un tipo sugiere que tiene 8 bits de longitud, entonces cualquier implementación sensata lo tipifica como tal. Por cierto, un byte (que es char
) es a menudo una unidad de 8 bits, es decir, un octeto.)