В Java 8 нет unsigned int
но зато работать с int
можно так так, будто это unsigned int
.
Стандартный тип int
может принимать значения от -2<sup>31</sup> до 2<sup>31</sup>-1.
При выходе за границы значений не выбрасываются исключения, но может возникнуть ошибка в вычислении.
Поэтому, если мы хотим работать с int
как с unsigned int
, мы можем продолжать использовать все те же операции с числами, и у нас не будет ошибки вычисления, если число не выходит за границы диапазона от 0 до 2<sup>32</sup>-1.
Для формирования строки, содержащей значение unsigned int
, необходимо использовать статический метод Integer.toUnsignedString(int i)
. Также, можно использовать метод Integer.toUnsignedLong(int i)
для получения правильного числа типа long.
Для того, чтобы получить unsigned int
из строки содержащей число в диапазоне 0 до 2<sup>32</sup>-1 необходимо использовать статический метод Indeger.parseUnsignedInt(String s)
. Методы Integer.toUnsignedString(int i)
и Indeger.parseUnsignedInt(String s)
обращают друг друга.
Приведенный ниже код демонстрирует эти возможности.
```java
public class App {
public static void main(String[] args) {
System.out.println("== Defining and evaluating ints ==");
int i1 = 0x00;
int i2 = 0x7F_FF_FF_FF;
int i3 = 0x80_00_00_00;
int i4 = 0xFF_FF_FF_FF;
int i5 = i3 + 1;
System.out.println("i1: s " + i1 + " u " + Integer.toUnsignedString(i1));
System.out.println("i2: s " + i2 + " u " + Integer.toUnsignedString(i2));
System.out.println("i3: s " + i3 + " u " + Integer.toUnsignedString(i3));
System.out.println("i4: s " + i4 + " u " + Integer.toUnsignedString(i4));
System.out.println("i5: s " + i5 + " u " + Integer.toUnsignedString(i5));
System.out.println("== Parsing ints ==");
int i6 = Integer.parseUnsignedInt("0");
int i7 = Integer.parseUnsignedInt("2147483647");
int i8 = Integer.parseUnsignedInt("2147483648");
int i9 = Integer.parseUnsignedInt("4294967295");
System.out.println("i6: s " + i6 + " u " + Integer.toUnsignedString(i6));
System.out.println("i7: s " + i7 + " u " + Integer.toUnsignedString(i7));
System.out.println("i8: s " + i8 + " u " + Integer.toUnsignedString(i8));
System.out.println("i9: s " + i9 + " u " + Integer.toUnsignedString(i9));
System.out.println("== Comparing ints ==");
boolean s12 = i1 > i2;
boolean u12 = Integer.compareUnsigned(i1, i2) > 0;
boolean s23 = i2 > i3;
boolean u23 = Integer.compareUnsigned(i2, i3) > 0;
boolean s34 = i3 > i4;
boolean u34 = Integer.compareUnsigned(i3, i4) > 0;
System.out.println("i1 > i2: signed: " + s12 + " unsigned: " + u12);
System.out.println("i2 > i3: signed: " + s23 + " unsigned: " + u23);
System.out.println("i3 > i4: signed: " + s34 + " unsigned: " + u34);
}
}
Полученный результат:
== Defining and evaluating ints ==
i1: s 0 u 0
i2: s 2147483647 u 2147483647
i3: s -2147483648 u 2147483648
i4: s -1 u 4294967295
i5: s -2147483647 u 2147483649
== Parsing ints ==
i6: s 0 u 0
i7: s 2147483647 u 2147483647
i8: s -2147483648 u 2147483648
i9: s -1 u 4294967295
== Comparing ints ==
i1 > i2: signed: false unsigned: false
i2 > i3: signed: true unsigned: false
i3 > i4: signed: false unsigned: false
```
Этот пост покрывает только часть особенностей Integer, полное описание смотри здесь: https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Если человек понимает, как это работает, он эти тривиальные процедуры сам напишет, а те, кто не понимают, обязательно споткнутся на вычислениях.
@hdghg Тут проблема не в том, что написано, а в том, что оставлено на пользователя, который постоянно должен помнить, что вот эти вот инты у него особенные, и что с ними можно и нельзя делать.
@hdghg iasu32Num, ёпта.
@ceyt То есть наоборот.
@hdghg Закажи майку «Я люблю венгерскую нотацию» и ходи в ней.