2013-03-04 13 views
11

Mam ciąg znaków w języku Java reprezentujący 16-bitową wartość podpisaną w języku HEX. Ten ciąg znaków może być dowolny od "0000" do "FFFF".16-bitowy łańcuch szesnastkowy do podpisanego int w Javie

Używam Integer.parseInt("FFFF",16), aby przekonwertować go na liczbę całkowitą. Zwraca jednak wartość bez znaku (65535).

Chcę, aby zwracała podpisaną wartość. W tym konkretnym przykładzie "FFFF" powinien zwrócić -1.

Jak mogę to osiągnąć? Ponieważ jego 16-bitowa wartość myślałem o użyciu Short.parseShort("FFFF",16), ale to mówi mi, że jestem poza zasięgiem. Domyślam się, że parseShort() spodziewa się znaku minus.

Odpowiedz

13

Można rzucać int wrócił z Integer.parseInt() do krótkiego:

short s = (short) Integer.parseInt("FFFF",16); 
System.out.println(s); 

Wynik:

-1 
+0

@AndreasFester, dlaczego ten wymaga dalszych obsady jako krótki ? – Rachael

+2

@Rachael Ponieważ wartość zwrócona przez 'Integer.parseInt' jest nadal (32-bitową) wartością' int' - dla '0xFFFF', to jest' 65535'. Przez przypisanie go do 'short', górne 16 bitów jest skutecznie odrzucane, a bit 15 jest traktowany jako bit znaku dla krótkiej wartości, co daje' -1' (wszystkie bity to 1). Obsada jest wymagana, aby powiedzieć kompilatorowi, że ta utrata bitów jest zamierzona - bez obsady kompilator narzekałby na "możliwą konwersję stratną z int na krótką" –

+0

@AndreasFester dziękuję za to świetne wyjaśnienie. – Rachael

2

spróbować

int i = (short) Integer.parseInt("FFFF", 16); 
+0

Dzięki za pomoc! – Dimme

Powiązane problemy