Объявление unsigned int в Java

есть ли способ объявить unsigned int в Java?

или вопрос может быть сформулирован так же: Что такое Java-эквивалент unsigned?

просто чтобы сказать вам контекст, который я смотрел на реализацию Java String.hashcode(). Я хотел проверить возможность столкновения, если целое число было 32 без знака int.

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.


использовать char для 16-битных целых чисел без знака.


возможно, это то, что вы имели в виду?

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);
                    }

вы можете использовать математику.функция abs (номер). Он возвращает положительное число.