2010-07-26 78 views
13

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. p. decimal => binario 4 => 100 (0000 0100) 8 => 1000 (0000 1000) bool value => ???Cuál es la representación binaria de un valor booleano en C#

+0

No puedo pensar en un escenario (que no sea una interoperabilidad a la que se vea obligado), donde es una buena idea tratar los booleanos como enteros. – SWeko

+2

Puede utilizar BitArray si desea consultar los valores binarios. No puede usar el reloj, pero puede usar .Obtener [x] para obtener el valor de cada uno de los bits (verdadero - 1, falso - 0). También puede usar Convert.ToByte() para convertir el tipo de bool a byte. – gooch

+0

@gooch: 'Convert.ToByte (bool)' solo hace el equivalente a 'return (byte) (value? 1: 0);' por lo que en realidad no prueba nada sobre la representación subyacente. Simplemente sucede que la representación subyacente es la misma. – LukeH

Respuesta

0

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

Sin embargo, hay una excepción importante, a saber, VB6, que tenía true igual a -1. Esto dificultó la migración a .NET, ya que el sistema de tipo flexible 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 a true en un contexto booleano. Algunos lenguajes (especialmente los dinámicos) 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 ...) igual a true.

+3

En un sistema anterior, -1 (0xffffff) y 0 también se usan. –

+5

Pensé que C trataba 0 como falso, y cualquier otra cosa como verdad? – Oded

+0

@Oded: sí, cierto ==! falso. Lo mismo para las conversiones formulario puntero. –

20

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

El C# 4.0 Especificación del Lenguaje estados en la sección 4.1.8:

El tipo bool representa cantidades lógicas booleanas. Los valores posibles del 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++, un valor nulo integral o coma flotante, o un puntero nulo se pueden convertir al valor booleano false, y un valor integral nulo o coma flotante no nulo, o un valor nulo el puntero se puede convertir al valor booleano true. En C#, tales conversiones se logran al comparar explícitamente un valor integral o de coma flotante a cero, o al comparar explícitamente una referencia de objeto a nulo.

Si tomamos esto un nivel más profundo y ver cómo el tipo correspondiente se especifique en el lenguaje Common Intermediate (CIL), veremos que un tipo booleano CLI ocupa 1 byte en la memoria. La Infraestructura (CLI) especificación Common Language dice en la partición III, sección 1.1.2:

tipo A CLI de Boole 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 distinto de 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 compilador C# decidió asignar un bool en C# a algo diferente, su código C# aún tendría la misma semántica.

+1

tipo básico incorporado de .NET, en realidad. C# 'bool' es solo una abreviatura de .NET' System.Boolean' –

+0

@Anthony Pegram: Es cierto, pero como la pregunta era específica de C#, solo me refería a la especificación de C#. –

7

Aquí hay un poco rápida de código que demuestra la representación subyacente de bool, en la plataforma actual dondequiera que pasa a estar en ejecución:

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 parece 1 para representar true y 0 aparece para representar false, esto es solo un detalle de la implementación. No debe confiar en este detalle, ni suponer que se mantendrá constante en las diferentes versiones y/o implementaciones, o incluso que la plataforma actual siempre use el mismo representatio consistente n)

EDITAR ...

El ECMA CLI spec (partición III, sección 1.1.2) es bastante claro sobre las representaciones admisibles 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 distinto de 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 de "falso" (por 0) seguido de 255 líneas de la "verdadera":

// 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); 
} 
+2

Tenga en cuenta que 'object.Equals()' no considera dos 'bool' que son internamente diferentes como iguales. Podría decirse que se trata de un error con 'object.Equals()' y es poco probable que presente un código lógico, pero al menos hay un caso en el que, si bien la especificación CLI considera que algo es cierto, el BCL no lo hace. –

5

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

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í sea .NET maneja los booleanos en la memoria, es solo cómo los convierte en matrices de bytes.

0

Normalmente, Boolean valores están representados por false siendo todos ceros y true siendo cualquier cosa. Para simplificar, esto es normalmente -1 (todos los bits activados de un tipo integral) debido a Two's Complement.

Cuestiones relacionadas