Системы счисления
От: mrDD  
Дата: 23.05.06 12:50
Оценка:
Помогите пожалуйста, нужно перевести из число из десятичной системы в шестнадцатиричную, и обратно
следущий код нормально работает на положительных чисел, но если мы конвертируем отрицательное десятичное в шестнадцатиричное, а затем обратно — вылетает эксэпшн

java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"

// перевод из строкового представления числа в десятичной системе счисления
// в строковое представление числа в шестнадцатиричной системе счисления
StringBuffer strBuffer = new StringBuffer();
long a = Long.valueOf("-1");
strBuffer.append(Long.toHexString(a).toUpperCase());

// обратный перевод - в следущей строке вылетает Exception
long a = Long.decode("0x" + strBuffer.toString());
strBuffer.delete(0, strBuffer.length());
strBuffer.append(Long.toString(a));
Re: Системы счисления
От: DK3981 Россия  
Дата: 23.05.06 13:02
Оценка:
DD>java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"

DD>
DD>// обратный перевод - в следущей строке вылетает Exception
DD>long a = Long.decode("0x" + strBuffer.toString());
DD>strBuffer.delete(0, strBuffer.length());
DD>strBuffer.append(Long.toString(a));
DD>


Читаем документацию:

The sequence of characters following an (optional) negative sign and/or radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the Long.parseLong method with the indicated radix (10, 16, or 8). This sequence of characters must represent a positive value or a NumberFormatException will be thrown. The result is negated if first character of the specified String is the minus sign. No whitespace characters are permitted in the String.

Для отрицательных чисел надо использовать знак — в начале: decode("-0x64") даст в результате -100.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Системы счисления
От: Blazkowicz Россия  
Дата: 23.05.06 13:09
Оценка:
Здравствуйте, mrDD, Вы писали:

DD>Помогите пожалуйста, нужно перевести из число из десятичной системы в шестнадцатиричную, и обратно

DD>следущий код нормально работает на положительных чисел, но если мы конвертируем отрицательное десятичное в шестнадцатиричное, а затем обратно — вылетает эксэпшн

DD>java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"


DD>
DD>// перевод из строкового представления числа в десятичной системе счисления
DD>// в строковое представление числа в шестнадцатиричной системе счисления
DD>StringBuffer strBuffer = new StringBuffer();
DD>long a = Long.valueOf("-1");
DD>strBuffer.append(Long.toHexString(a).toUpperCase());

DD>// обратный перевод - в следущей строке вылетает Exception
DD>long a = Long.decode("0x" + strBuffer.toString());
DD>strBuffer.delete(0, strBuffer.length());
DD>strBuffer.append(Long.toString(a));
DD>



Long.toHexString преобразует значение в беззнаковое представление. Тогда как Long.decode работает со строками содержащими знак. Вот и получается что значение FFFFFFFFFFFFFFFF за границей знакового long.
Re: Системы счисления
От: ZloiAdun  
Дата: 23.05.06 13:10
Оценка:
JavaDoc для Long.decode(String nm):

This sequence of characters must represent a positive value or a NumberFormatException will be thrown.

А значение FFFFFFFFFFFFFFFF больше чем Long.MAX_VALUE равное 7FFFFFFFFFFFFFFF
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.