Misterio con tipo de datos bool

#include  #include  int main() { bool a[5]={0,1,0,0,0}; a[1]=3; printf("\n bool is %d",a[1]); printf("\n sizeof bool is %d and size of a is %d",sizeof(bool),sizeof(a)); bool b[10]; printf("\n bool is %d",b[1]); } 

salida de este progtwig es

  bool is 1 sizeof bool is 1 and size of a is 5 bool is 4 

Pregunta:

1> bool store 1 bit entonces ¿por qué sizeof (bool) es 1 byte?

2> si bool tiene 1 byte, cuando asigno un [1] = 3, ¿por qué imprime 1?

3> si bool solo considera 1 & o el valor que se almacenará, entonces ¿por qué b [1] imprime el valor 3?

1> Bool store no es 1 bit. Nada es de 1 bit. Todo es al menos 1 byte. sizeof(bool) es específico de la plataforma. Sólo se garantiza que sizeof(char) sea ​​1.

2> Convierte implícitamente int en bool : (bool)3 == 1

3> la matriz b no está inicializada, puede tener cualquier valor. Sólo estás accediendo a algo de memoria.

La razón por la que el último printf imprime un 4, es porque la matriz b no está inicializada, lo que significa que la función printf simplemente toma cualquier valor que ya esté en la memoria.

En C no hay un tipo booleano real. C interpreta que un entero significa false si es 0 y todo lo demás como verdadero. Aunque un bool solo requeriría un solo bit, esto nunca se usa en la práctica ya que la unidad más pequeña accesible en la mayoría de las architectures es un byte. En lugar de ir por la ruta de enmascarar todos los bits menos uno en un byte, se utiliza el enfoque que expliqué anteriormente.

Está utilizando stdbool.h de C99, que proporciona un stdbool.h de typedef y las macros true y false . Las macros se expanden a 0 y 1 respectivamente, pero hacen que la fuente sea más descriptiva. El sizeof implementación está definido y no se puede confiar en que sea el mismo en diferentes plataformas.