2010-01-07 12 views
20

Estoy corriendo en una computadora Intel (Win7 de 64 bits) y de acuerdo con lo que leo Intel está usando Little-Endian. Trato esto en C# con el siguiente código:IsLittleEndian reportes de campo falso, pero debe ser Little-Endian?

byte[] b2 = new byte[] { 0, 1 }; 
short b2short = BitConverter.ToInt16(b2, 0); 

y b2short == 256 como se espera de un little-endian.

Después leí que en .NET, el BitConverter.IsLittleEndian debe reflejar lo endian el sistema está utilizando, y al comprobar la variable en Visual Studio informa falsa, es decir, no es little-endian.

¿Tiene algo que ver con el sistema operativo de 64 bits? ¿Algunas ideas?


EDIT: Mi colega, que está sentado frente a mí, hizo la misma prueba (Win Vista 32-bit) y obtuvo los mismos resultados


EDIT 2: Esto es realmente extraño . Cada vez que ejecuto el código, y rompo después de que el BitConverter hiciera lo suyo, el IsLittleEndian == falso. PERO, si agrego la línea Console.WriteLine (BitConverter.IsLittleEndian); posteriormente es cierto:

byte[] b2 = new byte[] { 0, 1 }; 
short b2short = BitConverter.ToInt16(b2, 0); 
Console.WriteLine(BitConverter.IsLittleEndian); 
// Now the IsLittleEndian is true 

Pero una vez que se quita la Console.WriteLine es falsa nuevo.

También puedo agregar que incluso si rompo en "Console.WriteLine" el IsLittleEndian == verdadero, pero si elimino la línea por completo es falso.


Datos 3: Como Mark Gravell señaló, esto debe haber algún momento de errores. Si utilizo la variable BitConverter.IsLittleEndian, se inicializa, si no lo hago (y lo miro al romper) no está inicializado y por lo tanto falso ...

+0

¿Qué inteligencia es? ¿Podría ser IA64? Aunque me han asegurado que incluso en IA64 podría usar LE. –

+0

Re the Console.WriteLine - vea mi punto sobre "beforefieldinit" ... –

+0

Estoy usando un procesador Intel i920 ... – Ted

Respuesta

20

Me pregunto si esto es un error de tiempo, tal vez relacionado con "beforefieldinit" ... ¿cómo estás mirando el valor? Es posible que el iniciador de tipo (para BitConverter) no esté siendo activado por el depurador VS (que se asoma bajo las cubiertas, por así decirlo). Especialmente desde false es el valor predeterminado para un campo ...

El campo estático IsLittleEndian se establece en el constructor estático; y el tiempo que ejecuta un inicializador es ... muy difícil de predecir. Si está utilizando un depurador, todas las apuestas están desactivadas. La única manera de comprobar de forma fiable el valor de este campo es a través de código (cuando el CLR se ejecutará el inicializador en algún momento antes de que se requiere):

bool isLittleEndian = BitConverter.IsLittleEndian; 

No confíe en las ventanas depurador/relojes, etc.

+0

Estoy mirando al romper el código o Console.Writeline. Eso podría ser, no se inicializa al romper el código, pero se inicializa cuando lo estoy usando en el código, como Console.WriteLine. – Ted

+0

Dado que dice que es falso si elimina la línea por completo, esto me lleva a pensar que ha puesto el punto de interrupción en la línea antes, lo que activaría * antes *. Se usa BitConverter. Me pregunto qué pasaría si él acaba de agregar otra línea después de su llamada a ToInt16, que no hizo nada relacionado con BitConverter, y se rompió en esa línea en su lugar, ¿sería entonces verdad? –

+0

Lasse: si se utiliza BitConverter.IsLittleEndian (como Console.WriteLine), se inicializa incluso antes de que se ejecute la línea. Esto, es verdad incluso antes de que se use BitConverter. – Ted

2

¿Cómo se está mirando?

Por ejemplo, ejecutar esta aplicación de consola corta:

using System; 

public class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine(BitConverter.IsLittleEndian); 
    } 
} 

Lo que hace que la impresión? ¿Podría dar detalles sobre qué hardware y sistema operativo está utilizando?

+0

"es una propiedad en lugar de una variable" - en realidad, es un campo estático. –

+0

@Marc: Sí, acabo de borrar ese bit, habiéndolo detectado por separado. Me avergüenza. –

+0

Jon: por favor lea mi "EDIT 2" arriba como respuesta a su pregunta. El comportamiento es muy extraño ... – Ted

0

Como Marc dice que parece ser un error de tiempo. Al usar el depurador VS para "mirar" el valor al inicio, devuelve falso, pero si lo imprimo en un cuadro de mensaje, devuelve verdadero.

5

Raymond Chen da expanded answer to the question.

El quid de la cuestión es que:

Lectura de un miembro del depurador no ejecuta el código para inicializar ese miembro.

De modo que cuando mira el campo en Visual Studio, informará de que falsa porque el inicializador estático aún no se ha ejecutado. Sin embargo, si utiliza el campo en el código, el inicializador estático se ejecutará, haciendo que el campo devuelva el valor correcto real.

+3

"Respondió una pregunta * muy similar * a esto?" Utilizó la respuesta de esta pregunta como la respuesta en su publicación;) – nemec

+2

@nemec - jaja, tienes razón. No hice clic en el enlace, solo repití la búsqueda web que mencionó. Se actualizó la respuesta para indicar que expandió la respuesta, en lugar de responder una muy similar. – FriendlyGuy

Cuestiones relacionadas