Объявление unsigned int в Java
9 ответов
Java нет целые числа без знака.
вы можете определить long
вместо int
Если вам нужно хранить большие значения, но нет способа исключить отрицательные значения.
однако, начиная с Java SE 8, есть несколько новых методов в Integer
класс, который позволяет использовать int
тип данных для выполнения арифметики без знака:
в Java SE 8 и более поздних, вы можете использовать тип данных int для представления 32-разрядного целого числа без знака, которое имеет минимальное значение 0 и максимальное значение 2^32-1. Используйте класс Integer для использования типа данных int в качестве целого числа без знака. Статические методы, такие как
compareUnsigned
,divideUnsigned
etc были добавлены в класс Integer для поддержки арифметических операций для целых чисел без знака.
отметим, что int
переменные по-прежнему подписываются при объявлении, но теперь возможна арифметика без знака использование этих методов в Integer
класса.
является ли значение в int подписанным или беззнаковым, зависит от того, как интерпретируются биты - Java интерпретирует биты как подписанное значение (у него нет беззнаковых примитивов).
Если у вас есть int, который вы хотите интерпретировать как значение без знака (например, Вы читаете int из DataInputStream, который, как вы знаете, содержит значение без знака), вы можете сделать следующий трюк.
int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffl;
обратите внимание, что важно, чтобы шестнадцатеричный литерал был длинным литералом, а не литералом int - отсюда " л " в конце.
нам нужны были неподписанные номера для моделирования unsigned MySQL TINYINT
, SMALLINT
, INT
, BIGINT
на jOOQ, именно поэтому мы создали jOOU, минималистичная библиотека, предлагающая типы оболочек для целых чисел без знака в Java. Пример:
import static org.joou.Unsigned.*;
// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);
все эти типы расширения java.lang.Number
и может быть преобразован в примитивные типы более высокого порядка и BigInteger
. Надеюсь, это поможет.
(отказ от ответственности: я работаю на компанию за этим библиотеки)
для беззнаковых чисел вы можете использовать эти классы из гуава библиотека:
Они поддерживают различные операции:
- плюс
- минус
- времени
- mod
- dividedBy
то, что кажется отсутствующим в данный момент, - это операторы сдвига байтов. Если вам нужны те, которые вы можете использовать BigInteger с Java.
возможно, это то, что вы имели в виду?
long getUnsigned(int signed) {
return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
-
getUnsigned(0)
→ 0 -
getUnsigned(1)
→ 1 -
getUnsigned(Integer.MAX_VALUE)
→ 2147483647 -
getUnsigned(Integer.MIN_VALUE)
→ 2147483648 -
getUnsigned(Integer.MIN_VALUE + 1)
→ 2147483649
только что сделал этот кусок кода, который преобразует "это.altura " от отрицательного к положительному числу. Надеюсь, это поможет кому-то в нужде
if(this.altura < 0){
String aux = Integer.toString(this.altura);
char aux2[] = aux.toCharArray();
aux = "";
for(int con = 1; con < aux2.length; con++){
aux += aux2[con];
}
this.altura = Integer.parseInt(aux);
System.out.println("New Value: " + this.altura);
}