В java возможно ли упаковать целое число, которое, как ожидается, не будет отрицательным и будет окончательным (не переполненным) в короткое? - PullRequest
0 голосов
/ 26 марта 2010

«Без знака int» в короткие и обратно. Это возможно? Как это сделать, если так?

Grrrr. Я забыл, как реализованы подписанные числа. Вопрос не имеет смысла. Спасибо, в любом случае. Я собирался понизить голос, ты можешь сделать это вместо этого.

Ответы [ 4 ]

1 голос
/ 26 марта 2010

Звучит так, будто вы надеетесь на базовый тип, который сделает всю работу за вас, но я не думаю, что он существует С другой стороны, я не думаю, что было бы слишком сложно создать объект, который выполняет эту работу. Отрегулируйте при необходимости, чтобы оно было коротким.

public class SpecialInt {
 int i = 0;

 public void set(int i) {
  if ( i < 0 ) throw new IllegalArgumentException("cannot be negative");
  this.i = i;
 }

 public void add(int j) {
  int t = i+j;
  if( t < i ) throw new IllegalArgumentException("overflow!");
  i = t;
 }

 public void sub(int j) {
  int t = i-j;
  if( t > i ) throw new IllegalArgumentException("overflow!");
  i = t;
 }

 public void mult(int j) {
  int mult_max = Integer.MAX_VALUE / i;
  if( j > mult_max ) throw new IllegalArgumentException("overflow!");
  i *= j;
 }
}
1 голос
/ 26 марта 2010

Я не уверен, что полностью понимаю вопрос, но если вы уверены, что ваш int вписывается в короткий (ваш номер между 0 и 2 ^ 16), вы всегда можете привести свой int к короткому:

int i = 65536;
short s = (short) i;

И чтобы вернуть значение без знака: int i2 = s & 0xFFFF; System.out.println (i2);

s & 0xFFFF преобразует s в целое число, а битовая маска "преобразует" отрицательное число в его значение без знака (в некотором роде). Помните, что FFFF в короткой переменной -1, а не 65536.

0 голосов
/ 26 марта 2010

Если вам нужны неподписанные типы, вы можете использовать библиотеку Javolution .

0 голосов
/ 26 марта 2010

Если ваше целое число не имеет какой-либо конкретной характеристики, такой как кратность чего-либо, я не думаю, что вы можете.

Проблема в том, что информация, содержащаяся в int, который обычно является 32-битной архитектурой, не может содержаться в коротком.

Как видно из Short.MAX_VALUE, максимальное значение равно 2 ^ 15 - 1, так как короткое занимает 16 бит ... так что вы на самом деле теряете точность и не можете выражать целые числа типа 2²² ..

...