Pregunta ¿Un `char` siempre-siempre-siempre tiene 8 bits?


Siempre he supuesto:

  1. que una char está representado por un byte,
  2. que un byte siempre se puede contar con 8 bits,
  3. ese sizeof (char) es siempre 1,
  4. y que la cantidad teórica máxima de memoria que puedo asignar (contada en chars) es la cantidad de bytes de RAM (+ espacio de intercambio).

Pero ahora que he leído el Entrada de Wikipedia en el byte Ya no estoy tan seguro.

¿Cuál (es) de mis suposiciones es incorrecta? ¿Cuál (es) es peligroso?


37
2018-03-15 20:15


origen


Respuestas:


  1. Sí, char y byte son más o menos lo mismo. Un byte es la menor cantidad de memoria direccionable, y también lo es char Cª. char siempre tiene el tamaño 1.

    De la especificación, sección 3.6 byte:

    byte

    unidad direccionable de almacenamiento de datos lo suficientemente grande como para contener cualquier miembro del conjunto de caracteres básicos del entorno de ejecución

    Y sección 3.7.1 personaje:

    personaje

    carácter de un solo byte
      <C> representación de bits que se ajusta en un byte

  2. UN char tiene CHAR_BIT bits. Podría ser cualquier número (bueno, 8 o más de acuerdo con la especificación), pero definitivamente es más a menudo 8. Hay máquinas reales con 16 y 32 bits char tipos, sin embargo. CHAR_BIT se define en limits.h.

    De la especificación, sección 5.2.4.2.1 Tamaños de tipos enteros <limits.h>:

    Los valores que figuran a continuación se sustituirán por expresiones constantes adecuadas para su uso en #if preprocesamiento de directivas. Por otra parte, a excepción de CHAR_BIT y MB_LEN_MAX, lo siguiente se reemplazará por expresiones que tengan el mismo tipo que una expresión que sea un objeto del tipo correspondiente convertido de acuerdo con las promociones enteras. Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) que los mostrados, con el mismo signo.

    - número de bits para el objeto más pequeño que no es un campo de bits (byte)
      CHAR_BIT8

  3. sizeof(char) == 1. Siempre.

    De la especificación, sección 6.5.3.4 El sizeof operador, párrafo 3:

    Cuando se aplica a un operando que tiene un tipo char, unsigned char, o signed char, (o una versión calificada de eso) el resultado es 1.

  4. Puede asignar tanta memoria como su sistema le permita asignar; no hay nada en el estándar que defina cuánto podría ser. Podría imaginarse, por ejemplo, una computadora con un sistema de asignación de memoria respaldado por almacenamiento en la nube: su memoria asignable podría ser prácticamente infinita.

    Aquí está la sección de especificaciones completas 7.20.3.3 El malloc función:

    Sinopsis

    1 #include <stdlib.h>
      void *malloc(size_t size);

    Descripción

    2 El malloc función asigna espacio para un objeto cuyo tamaño está especificado por size y cuyo valor es indeterminado.

    Devoluciones

    3 El malloc función devuelve un puntero nulo o un puntero al espacio asignado.

    Esa es la totalidad de la especificación, por lo que no hay ningún límite en el que pueda confiar.


37
2018-03-15 20:17



sizeof(char) siempre es 1 byte. Sin embargo, un byte no siempre es un octeto: el Texas Instruments TI C55x, por ejemplo, es un DSP con un byte de 16 bits.


7
2018-03-15 20:17



sizeof(char) se define para ser siempre 1. De C99:

Cuando se aplica a un operando que tiene tipo char, char sin signo o char firmado, (o una versión calificada del mismo) el resultado es 1.

Es no sin embargo, se garantiza que sea de 8 bits. En la práctica, en la gran mayoría de las plataformas, será, pero no, técnicamente no se puede contar con que siempre sea el caso (ni debería importar ya que debería estar usando sizeof de todas formas).


6
2018-03-15 20:17



Tradicionalmente, un byte no es necesariamente 8 bits, sino simplemente un poco   región de memoria, generalmente adecuada para almacenar un personaje. La C   El estándar sigue este uso, por lo que los bytes utilizados por malloc y sizeof   puede ser más de 8 bits. [nota al pie] (El Estándar no les permite   ser menos)

Pero sizeof (char) siempre es 1.

Memorizando el C Preguntas frecuentes es un movimiento que mejora la carrera.


3
2018-03-15 20:21



Concretamente, algunas arquitecturas, especialmente en el campo DSP, tienen caracteres de más de 8 bits. En la práctica, sacrifican espacio de memoria por velocidad.


2
2018-03-15 20:20



En C, un carácter siempre es un byte, por lo que su primera y tercera hipótesis son correctas.

Un byte es no siempre 8 bits, por lo tanto, su segunda suposición no siempre se cumple. Dicho esto,> = 99,99% de todos los sistemas existentes en la actualidad tienen caracteres de 8 bits, por lo que muchos códigos asumen implícitamente caracteres de 8 bits y se ejecutan perfectamente en todas las plataformas de destino. Ciertamente, las máquinas Windows y Mac siempre usan caracteres de 8 bits, y AFAIK Linux también (Linux ha sido portado a tantas plataformas que no estoy 100% seguro de que alguien no haya portado Linux a una plataforma donde los caracteres de 9 bits tener sentido).

La cantidad máxima de memoria que se puede asignar es el tamaño de la memoria virtual, menos el espacio reservado para el sistema operativo.


1
2018-03-15 20:16



Lo desafortunado (o tal vez afortunado, dependiendo de cómo veas las cosas) es que la idea de que un byte se considere comúnmente como (8 bits) no es sinónimo de lo que el lenguaje de programación C considera que es un byte. Al observar algunas de las respuestas anteriores, un byte tiene una definición exacta cuando se trata del lenguaje de programación C y en ninguna parte de la definición menciona un byte de 8 bits. Simplemente menciona que un byte es

"una unidad direccionable de almacenamiento de datos lo suficientemente grande como para mantener a cualquier miembro de   el conjunto de caracteres básicos del entorno de ejecución ".

Entonces, para responder a su pregunta, "¿Será char siempre-siempre-siempre tiene 8 bits ", la respuesta es, no siempre, pero con mayor frecuencia lo hará. Si le interesa saber exactamente cuántos bits de espacio consumen sus tipos de datos en su sistema, puede usar la siguiente línea de código:

sizeof(type) * CHAR_BIT

Dónde, type es tu tipo de datos Por ejemplo, para saber cuántos bits a char toma su sistema, puede usar lo siguiente:

printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);

Esto se toma del Manual de referencia de la Biblioteca GNU C, que contiene la siguiente explicación esclarecedora sobre este tema:

No hay operador en el lenguaje C que pueda darle la cantidad de   bits en un tipo de datos entero. Pero puedes calcularlo desde la macro   CHAR_BIT, definido en el archivo de cabecera limits.h. CHAR_BIT - Este es el   número de bits en un char-ocho, en la mayoría de los sistemas. El valor tiene tipo   En t. Puede calcular la cantidad de bits en cualquier tipo de datos, tipo   esta:

    `sizeof (type) * CHAR_BIT` 

Esa expresión incluye los bits de relleno, así como los bits de valor y signo.


1
2018-05-12 23:56