Неподписанный короткий в Java - PullRequest
55 голосов
/ 03 декабря 2009

Как я могу объявить значение unsigned short в Java?

Ответы [ 15 ]

66 голосов
/ 03 декабря 2009

Вы не можете, правда. В Java нет типов данных без знака, кроме char.

По общему признанию, вы могли бы использовать char - это 16-битный тип без знака - но это было бы ужасно, на мой взгляд, так как char явно предназначено для текста: когда код использует char, я ожидаю, что он будет использовать его для кодовых единиц UTF-16, представляющих интересный для программы текст, а не произвольные 16-разрядные целые числа без знака без отношения к тексту.

13 голосов
/ 03 декабря 2009

Если вам действительно нужно значение точно с 16 битами:

Решение 1: Используйте доступное подписанное короткое замыкание и перестаньте беспокоиться о знаке, если только вам не нужно делать сравнение (<, <=,>,> =) или деление (/,%, >> ) операции. См. этот ответ , чтобы узнать, как обрабатывать числа со знаком, как если бы они были без знака.

Решение 2 (где решение 1 не применимо): Используйте младшие 16 битов int и удалите старшие биты с помощью & 0xffff, где это необходимо.

12 голосов
/ 17 мая 2012

Это действительно несвежая тема, но в интересах любого, кто придет после. Char является числовым типом. Он поддерживает все математические операторы, битовые операции и т. Д. Это без знака 16.

Мы обрабатываем сигналы, записанные пользовательским встроенным оборудованием, поэтому мы обрабатываем большое количество беззнаковых 16 из A-D. Мы годами использовали символы везде, и у нас никогда не было проблем.

10 голосов
/ 03 декабря 2009

Вы можете использовать символ, так как это 16-разрядное значение без знака (хотя технически это символ Unicode, поэтому в будущем он может измениться на 24-разрядное значение) ... другой альтернативой является использование int и убедитесь, что он находится в пределах досягаемости.

Не используйте char - используйте int: -)

А вот ссылка , обсуждающая Java и отсутствие неподписанных .

4 голосов
/ 21 октября 2014

Из DataInputStream.java

public final int readUnsignedShort() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (ch1 << 8) + (ch2 << 0);
}
3 голосов
/ 03 декабря 2009

Нет такого типа в Java

1 голос
/ 08 августа 2018

Нет, на самом деле такого метода не существует, java - язык высокого уровня. Вот почему в Java нет неподписанных типов данных.

1 голос
/ 03 декабря 2009

Да нет, если вы хотите использовать значение в коде вместо битовых операций.

0 голосов
/ 11 декабря 2018
//вот метод для получения аналога unsigned short
    public static int getShortU(byte [] arr, int i )  throws Exception 
    {
       try
       {
           byte [] b = new byte[2]; 
           b[1] = arr[i];
           b[0] = arr[i+1];
           int k = ByteBuffer.wrap(b).getShort();
            //if this: 
           //int k = ((int)b[0] << 8) + ((int)b[1] << 0); 
           //65536 = 2**16
           if ( k <0) k = 65536+ k; 
        return k;
      }  
       catch(Throwable t)
      {
          throw  new Exception ("from getShort: i=" + i);
      }
    }
...