2008-11-26 25 views
9

Esto es follow up question.C#, notación hexadecimal y enteros con signo

Por lo tanto, los números enteros de Java Store en two's-complements y que pueden hacer lo siguiente:

int ALPHA_MASK = 0xff000000; 

en C# esto requiere el uso de un entero sin signo, uint, porque interpreta que esto es 4278190080 en lugar de -16777216.

Mi pregunta, ¿cómo declaro los valores negativos en notación hexadecimal en C#, y cómo exactamente son enteros representados internamente? ¿Cuáles son las diferencias con Java aquí?

Respuesta

22

C# (más bien, .NET) también usa el complemento de dos, pero admite tanto los tipos firmados como los no firmados (lo que Java no hace). Una máscara de bit es, naturalmente, algo sin firmar: ¿por qué un bit debería ser diferente de todos los demás?

En este caso específico, es seguro de usar un molde sin marcar:

int ALPHA_MASK = sin marcar ((int) 0xFF000000);

Editar (en el original):

Para "directamente" representan este número como un valor firmado, se escribe

int ALPHA_MASK = -0x1000000; // == -16777216

Hexadecimal no es (o no debería ser) diferente del decimal: para representar un número negativo, debe escribir un signo negativo, seguido de los dígitos que representan el valor absoluto.

5

Bueno, se puede utilizar un bloque sin control y un reparto:

unchecked 
{ 
    int ALPHA_MASK = (int)0xff000000; 
} 

o

int ALPHA_MASK = unchecked((int)0xff000000); 

No es terriblemente conveniente, aunque ... tal vez sólo tiene que utilizar un literal entero?

+0

no tenía idea de C# tenía esta palabra clave. ¡Guay! –

0

Y para colmo de males, esto funcionará también:

-0x7F000000

Cuestiones relacionadas