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#
Respuesta
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
.
En un sistema anterior, -1 (0xffffff) y 0 también se usan. –
Pensé que C trataba 0 como falso, y cualquier otra cosa como verdad? – Oded
@Oded: sí, cierto ==! falso. Lo mismo para las conversiones formulario puntero. –
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 tipobool
sontrue
yfalse
.No existen conversiones estándar entre
bool
y otros tipos. En particular, el tipobool
es distinto y separado de los tipos integrales, y no se puede usar un valorbool
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 booleanotrue
. 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.
tipo básico incorporado de .NET, en realidad. C# 'bool' es solo una abreviatura de .NET' System.Boolean' –
@Anthony Pegram: Es cierto, pero como la pregunta era específica de C#, solo me refería a la especificación de C#. –
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);
}
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. –
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.
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.
- 1. Representación binaria de un número en C
- 2. ¿Visualiza la representación binaria de un número en C?
- 3. ¿Cuál es el valor booleano predeterminado en C#?
- 4. operador | = para un valor booleano en C++
- 5. ¿Cuál es la forma "correcta" de pasar un valor booleano a una extensión Python C?
- 6. ¿Cuál es la diferencia entre booleano y booleano en Java?
- 7. ¿Cuál es la mejor representación de valor para boolean en DICOM?
- 8. ¿Cuál es la codificación correcta de un valor booleano en un mensaje SOAP?
- 9. representación binaria compacta de json
- 10. Representación binaria de .NET Decimal
- 11. ¿Cuál es la mejor opción para indexar un valor booleano en lucene?
- 12. ¿Cuál es la forma más concisa de obtener el inverso de un valor booleano de Java?
- 13. convertir cadena de texto a representación hexadecimal o representación binaria
- 14. Cuál es el tamaño de booleano GLSL
- 15. Cómo obtener la representación binaria IEEE 754 de un flotador en C#
- 16. ¿Cómo comprobar si la representación binaria de un entero es un palíndromo?
- 17. Almacenar valor booleano en SQLite
- 18. ¿Cómo crear un valor booleano?
- 19. Cómo ver la representación binaria de la variable
- 20. Representación de flotador en C
- 21. ¿Cuál es la diferencia en la representación en asp.mvc
- 22. Imprimir el valor de un valor booleano en Log
- 23. ¿Cuál es la representación interna de inf y NaN?
- 24. ¿Cuál es el tercer estado booleano en java?
- 25. booleano [] vs. BitSet: ¿Cuál es más eficiente?
- 26. ¿Cuál es la mejor manera de analizar un atributo booleano XML (en .NET)?
- 27. lo que será el valor predeterminado de un valor booleano inicializado en C++
- 28. Char o Int para el valor booleano en C?
- 29. ¿La forma más fácil de voltear un valor booleano?
- 30. ¿Cuál es la mejor manera de convertir una variable a un booleano en php?
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
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
@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