2008-11-26 15 views
9

To jest follow up question.C#, zapis szesnastkowy i liczby całkowite ze znakiem

Więc całkowitymi Java sklepu w two's-complements i można wykonać następujące czynności:

int ALPHA_MASK = 0xff000000; 

w C# to wymaga użycia liczba całkowita bez znaku, uint, ponieważ interpretuje to być 4278190080 zamiast -16777216.

Moje pytanie: jak deklarować wartości ujemne w notacji szesnastkowej w języku C# i jak dokładnie są to liczby całkowite reprezentowane wewnętrznie? Jakie są różnice w stosunku do Java?

Odpowiedz

22

C# (raczej .NET) również używa uzupełnienia dwójki, ale obsługuje zarówno typy podpisane, jak i niepodpisane (których Java nie obsługuje). Trochę maski jest bardziej naturalnie rzeczą niepodpisaną - dlaczego jeden bit byłby inny niż wszystkie inne?

W tym konkretnym przypadku, jest bezpieczny w użyciu niesprawdzany Obsada:

int ALPHA_MASK = niezaznaczone ((int) 0xFF000000);

Edit (dodane):

Do "bezpośrednio" stanowią tę liczbę jako wartość podpisanego, piszesz

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

Szesnastkowy nie jest (lub nie powinien) różnić się od dziesiętnej: aby reprezentować liczbę ujemną, należy wpisać znak ujemny, a następnie cyfry reprezentujące wartość bezwzględną.

5

Cóż, można użyć niezaznaczone blok i obsada:

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

lub

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

Nie strasznie wygodne, chociaż ... może po prostu użyć dosłownego całkowitą?

+0

Nie miałem pojęcia, C# miałem tego słowa kluczowego. Chłodny! –

0

I właśnie na domiar zlego, to będzie działać zbyt:

-0x7F000000