¿Cuál es la representación binaria de un valor booleano en c #

Sé que un valor booleano es de 1 byte (8 bits de longitud), pero me gustaría saber cuál es su representación binaria. ej. decimal => binario 4 => 100 (0000 0100) 8 => 1000 (0000 1000) valor bool => ???

bool es un tipo básico incorporado en C #. Cualquier representación subyacente sería un detalle de implementación.

La especificación de lenguaje C # 4.0 establece en la sección 4.1.8:

El tipo bool representa cantidades lógicas booleanas. Los valores posibles de tipo bool son true y false .

No existen conversiones estándar entre bool y otros tipos. En particular, el tipo bool es distinto y separado de los tipos integrales, y no se puede usar un valor bool en lugar de un valor integral, y viceversa.

En los lenguajes C y C ++, una integral cero o un valor de punto flotante, o un puntero nulo se puede convertir al valor booleano false , y una integral distinta de cero o un valor de punto flotante, o un puntero no nulo se puede convertir al valor booleano true . En C #, tales conversiones se realizan comparando explícitamente un valor de punto flotante o integral a cero, o comparando explícitamente una referencia de objeto a nula.

Si profundizamos más en este nivel y vemos cómo se especifica el tipo correspondiente en el lenguaje Intermedio Común (CIL), veremos que un tipo booleano CLI ocupa 1 byte en la memoria. La especificación de la infraestructura de lenguaje común (CLI) dice en la partición III, sección 1.1.2:

Un tipo booleano CLI ocupa 1 byte en la memoria. Un patrón de bits de todos los ceros denota un valor de falso. Un patrón de bits con uno o más bits establecidos (análogo a un entero que no es cero) denota un valor de verdadero.

Sin embargo, esto se especifica en otro nivel y desde C # no debería tener que preocuparse; incluso si una versión futura de la especificación CLI podría cambiar la representación del tipo booleano, o si el comstackdor de C # decidiera asignar un bool en C # a algo diferente, su código de C # todavía tendría la misma semántica.

Aquí hay un fragmento rápido de código que demuestra la representación subyacente de bool , en la plataforma actual donde quiera que se esté ejecutando :

 var x = new NotAGoodIdea(); x.TheBool = true; Console.WriteLine(x.TheByte); // 1 x.TheBool = false; Console.WriteLine(x.TheByte); // 0 // ... [StructLayout(LayoutKind.Explicit)] public struct NotAGoodIdea { [FieldOffset(0)] public bool TheBool; [FieldOffset(0)] public byte TheByte; } 

(Tenga en cuenta que aunque 1 parece representar true y 0 parece ser false , esto es solo un detalle de la implementación. No debe confiar en este detalle, o suponer que seguirá siendo coherente en diferentes versiones y / o implementaciones, o incluso que La plataforma actual siempre usa la misma representación consistente.)

EDITAR…

La especificación ECMA CLI (partición III, sección 1.1.2) es bastante clara acerca de las representaciones permitidas del tipo Boolean :

1.1.2 Tipo de datos booleanos

Un tipo booleano CLI ocupa 1 byte en la memoria. Un patrón de bits de todos los ceros denota un valor de falso. Un patrón de bits con uno o más bits establecidos (análogo a un entero que no es cero) denota un valor de verdadero.

Parece que el Microsoft CLR actual se adhiere a la especificación ECMA al permitir múltiples representaciones de true . El siguiente ejemplo muestra una sola línea “Falsa” (para 0 ) seguida de 255 líneas de “Verdadero”:

 // re-use the NotAGoodIdea struct from the previous example var x = new NotAGoodIdea(); for (int i = 0; i < 256; i++ ) { x.TheByte = (byte)i; Console.WriteLine(x.TheBool); } 

No estoy contradiciendo la respuesta de 0xA3, pero si usas:

 BitConverter.GetBytes(true); BitConverter.GetBytes(false); 

Obtendrá una matriz de bytes de { 1 } y { 0 } . En otras palabras, los valores binarios serían 00000001 y 00000000 .

Esto no significa que así es como .NET maneja los booleanos en la memoria, es solo la forma en que los convierte en matrices de bytes.

Casi todos los lenguajes / entornos (no solo .NET) implementan true como equivalente al valor integral 1, y false igual a 0. 1)

Sin embargo, hay una excepción importante, a saber, VB6, que tuvo una true igual a –1. Esto dificultó bastante la migración a .NET, ya que el sistema de tipo suelto de VB6 permitía mezclar enteros y booleanos en la misma expresión, y 2 And True significaba algo más en VB6 que en VB.NET.


1) Aunque muchos sistemas permiten una conversión implícita de cualquier valor numérico desigual a 0 en true en un contexto booleano. Algunos idiomas (especialmente dynamics) incluso van más allá, y dicen que todos los objetos, excepto los objetos especiales (por ejemplo, None , matriz vacía, la lista continúa …) son true .

Normalmente, Boolean valores Boolean están representados por false todos ceros y true lo demás. Por simplicidad, normalmente es -1 (todos los bits de un tipo integral con signo) debido al Complemento de Dos .