tipo - unsigned char c
Escriba para usar para representar un byte en ANSI(C89/90) C? (6)
¿Existe un método de quejas estándar para representar un byte en ANSI (C89 / 90) C? Sé que, la mayoría de las veces, un char resulta ser un byte, pero tengo entendido que no se garantiza que sea así. Además, hay stdint.h en el estándar C99, pero ¿qué se usó antes del C99?
Tengo curiosidad sobre los 8 bits específicamente, y un "byte" (sizeof (x) == 1).
Antes de C99? Código dependiente de la plataforma.
Pero, ¿por qué te importa? Solo use stdint.h.
En cada implementación de CI utilizada (desde el antiguo UNIX hasta compiladores integrados escritos por ingenieros de hardware para compiladores de grandes proveedores), el char
siempre ha sido de 8 bits.
En ANSI C89 / ISO C90 sizeof (char) == 1. Sin embargo, no siempre es el caso que 1 byte sea 8 bits. Si desea contar la cantidad de bits en 1 byte (y no tiene acceso a los límites), le sugiero lo siguiente:
unsigned int bitnum(void) {
unsigned char c = ~0u; /* Thank you Jonathan. */
unsigned int v;
for(v = 0u; c; ++v)
c &= c - 1u;
return(v);
}
Aquí usamos el método de Kernighan para contar la cantidad de bits configurados en c . Para entender mejor el código anterior (o ver otros similares), lo remito a " Bit Twiddling Hacks ".
Noté que algunas respuestas han redefinido el byte de la palabra para que signifique algo distinto de 8 bits. Un byte es de 8 bits, sin embargo, en algunas implementaciones de c, char es de 16 bits (2 bytes) u 8 bits (1 byte). Las personas que llaman byte a la "unidad de memoria direccionable más pequeña" o algo de esa basura han perdido la comprensión del significado del byte (8 bits). La razón por la que algunas implementaciones de C tienen caracteres de 16 bits (2 bytes) y algunas tienen caracteres de 8 bits (1 byte), y no hay un tipo estándar llamado ''byte'', se debe a la pereza.
Entonces, deberíamos usar int_8
Puede encontrar macros y typedefs bastante confiables en boost.
Siempre puede representar un byte (si se refiere a 8 bits) en un carácter sin signo. Siempre tiene al menos 8 bits de tamaño, y todos los bits componen el valor, por lo que siempre cabe un valor de 8 bits.
Si quiere exactamente 8 bits, también creo que tendrá que usar formas dependientes de la plataforma. Parece que los sistemas POSIX son required para admitir int8_t. Eso significa que en sistemas POSIX, char (y por lo tanto un byte) es siempre de 8 bits.
char
es siempre un byte , pero no siempre es un octeto . Un byte es la unidad de memoria direccionable más pequeña (en la mayoría de las definiciones), un octeto es una unidad de memoria de 8 bits.
Es decir, sizeof(char)
siempre es 1 para todas las implementaciones, pero la macro CHAR_BIT
en limits.h
define el tamaño de un byte para una plataforma y no siempre es de 8 bits. Hay plataformas con bytes de 16 bits y 32 bits, por lo que char
ocupará más bits, pero sigue siendo un byte. Como el rango requerido para char
es de al menos -127 a 127 (o de 0 a 255), será de al menos 8 bit en todas las plataformas.
ISO / IEC 9899: TC3
6.5.3.4 El operador de sizeof
- ...
- El operador sizeof produce el tamaño ( en bytes ) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. [...]
- Cuando se aplica a un operando que tiene un tipo
char
,unsigned char
, osigned char
, (o una versión cualificada del mismo) el resultado es 1 . [...]
Énfasis mío