2009-12-03 2 views
42

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

+2

связанный с этим вопрос, если вы заинтересованы в мотивации этого: «Почему поддержка не Java беззнаковых Интс?» HTTP: // StackOverflow .com/questions/430346 – Heinzi

+4

@ PP: Если вам нужен язык с сильными сторонами Java и C++, я могу порекомендовать Scala. Это действительно хорошо, когда вы можете дивиться с типами. –

+2

использовать подписанный короткий. все соответствующие битовые операции имеют варианты, которые обрабатывают значение как unsigned. – james

ответ

59

Вы не можете, действительно. Java не имеет никаких неподписанных типов данных, кроме char.

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

+17

@Jon: В Java нет способа иметь обычный байт на уровне машины, что означает 8-битное местоположение, которое может содержать значения [0-255] вместо [-128 - +127]. Я не могу поверить, что они заставляют нас использовать ** подписанные байты **, когда все, что вам нужно сделать на C, - это 'unsigned char'. После того, как вы начнете путь только к подписанным типам данных, он завинчивает все ваши неподписанные растровые изображения. На самом деле довольно неприятно. Дизайнеры Java подумали, что они упрощают работу, чтобы сделать их менее подверженными ошибкам, но снова все, что им удалось сделать, это сделать их намного сложнее и подвержен ошибкам, чем раньше. В Java много чего. – tchrist

+2

@Jon: OTOH, так как символ 'char' неприменим для кодовых точек Unicode, вы можете просто использовать его для беззнаковых шорт: он не будет более ужасным, чем любой существующий код, используя' char', когда они действительно должны использовать ' int'. – ninjalj

+4

@ninjalj, Oh * где * вы 'typedef'? – Pacerier

-1

В Java нет неподписанных типов. Для чего тебе это?

Однако у Java есть тип данных 'byte'.

+0

байт 8 бит, короткий 16 бит ... не думаю, что байт будет работать :-) – TofuBeer

+0

Я хотел бы построить многомерный массив, например, 10000 * 10000 записей коротких номеров ... вот почему я думал о неподписанных шортах, для выделения меньше памяти – maiky

+0

Спасибо за исправление TofuBeer. Слишком быстро на ничьей, я думаю. – CBFraser

1

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

9

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

Не используйте символ - используйте Int :-)

А вот link discussing Java and the lack of unsigned.

+3

char определяется как 16 бит, а не символ Юникода (независимо от того, что это означает), всегда и навсегда. Если char изменен на 24 бита, он больше не будет Java. – Ken

+1

Я не думаю, что это тоже изменится. Причина, по которой 16 бит - поддерживать unicode (из JLS: «платформа Java отслеживает спецификацию Unicode по мере ее развития» и «стандарт Unicode был первоначально разработан как 16-разрядная кодировка с фиксированной шириной») и из java .lang.Character: «Методы, которые принимают только значение char, не могут поддерживать дополнительные символы», поэтому origianlly char был 16 бит, потому что именно так был широкоугольный unicode. Теперь unicode больше, и char больше не может представлять все символы Unicode. – TofuBeer

-1

Вы можете создать себе код ShortUnsigned и определить методы для тех операторов, которые вы хотите. Увы, вы не сможете перегрузить + и -, а другие на них, а также не подразумевать преобразование типов с другими примитивными или числовыми типами объектов, увы.

Как и некоторые другие ответчики, я задаюсь вопросом, почему у вас есть настоятельная необходимость в беззнаковом коротком замыкании, которое не будет заполнено никаким другим типом данных.

12

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

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

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

+0

'sBuff.append (новый Integer (iArray [i ++] & 0xffff) +", ");' спасибо! – essa

9

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

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

-1

Простая программа, чтобы показать, почему необходимо без знака:

package shifttest; 
public class ShiftTest{ 
    public static void main(String[] args){ 
     short test = -15000; 
     System.out.format ("0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n", 
      test, test>>1, test>>2, test>>3, test>>4); 
    } 
} 

результаты:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56 

Теперь для тех, которые не являются типы систем:

JAVA делает арифметический сдвиг, потому что однако, есть случаи, когда логический сдвиг был бы уместным, но JAVA (в частности, Sun), считал это ненужным, слишком плохим для нас по их недальновидности. Shift, And, Or, and Exclusive или ограниченные инструменты, когда все, что у вас есть, - это более длинные номера. Это особая проблема при взаимодействии с аппаратными устройствами, которые говорят об ошибках «REAL», которые составляют 16 бит или более. «char» не гарантированно работает (сейчас он равен двум байтам), но на нескольких восточных языках, например на китайском, корейском и японском языках, требуется не менее 3 байт. Я не знаком с потребностью в количестве для языков стиля sandscript. Количество байтов не зависит от программиста, а от комитета по стандартам JAVA. Таким образом, базируя char как 16 бит, существует риск нисходящего потока. Чтобы безопасно реализовать беззнаковые шорты JAVA, особый класс является лучшим решением, основанным на вышеупомянутых неоднозначностях. Недостатком класса является неспособность перегрузить математические операции для этого специального класса. Многие из авторов этой темы точно указали на эти проблемы, но мой вклад - это пример рабочего кода и мой опыт работы с 3-байтными языками gif в C++ под Linux.

+0

Вы можете использовать 'System.out.формат («0x% 04X 0x% 04X 0x% 04X 0x% 04X 0x% 04X \ n», test, test & 0xffff >> 1, test & 0xffff >> 2, test & 0xffff >> 3, test & 0xffff >> 4); '. Это даст вам неподписанный сдвиг короткого замыкания. Однако это добавляет 1 операцию (побитовое &) к каждому дерьму. – CITBL

+0

Java имеет логический оператор сдвига вправо, '>>>'. Кроме того, 'char' никогда не изменит свой размер. –

0

Он сказал, что хочет создать многомерный короткий массив. Но никто не предложил поразрядных операторов? Из того, что я читал, вы хотите использовать 16-битные целые числа из 32-битных целых чисел для экономии памяти?

Итак, во-первых, чтобы начать 10 000 x 10 000 коротких значений - 1600 000 000 бит, 200 000 000 байт, 200 000 килобайт, 200 мегабайт.

Если вам нужно что-то с потреблением памяти в 200 МБ, вы можете захотеть перепроектировать эту идею. Я также не считаю, что даже компиляция не говоря уже о побеге. Вы никогда не должны инициализировать такие большие массивы, если что-нибудь использует 2 функции, называемые On Demand Loading и кэширование данных. По сути, загрузка по требованию подразумевает идею загрузки данных по мере необходимости. Тогда кэширование данных делает то же самое, но использует пользовательскую работу фрейма для удаления старой памяти и добавления новой информации по мере необходимости. Это сложная задача, чтобы иметь высокую скорость работы. Есть и другие вещи, которые вы можете сделать, но эти двое - мои любимые, когда все сделано правильно.

Хорошо, что я говорил о побитовых операторах.

Итак, 32-битное целое число или в Java «int». Вы можете сохранить так называемые «биты», так что предположим, что у вас было 32 булевых значения, которые в Java все значения занимают 32 бита (за исключением длинного), или для массивов они занимают 8 для байта, 16 для краткости и 32 для int , Поэтому, если у вас нет массивов, вы не получаете каких-либо преимуществ памяти от использования байта или короткого замыкания. Это не значит, что вы не должны использовать его как способ обеспечить, чтобы вы и другие знали диапазон данных, который должен иметь это значение.

Теперь, когда я говорю, что вы могли бы эффективно хранить 32 Booleans в единое целое, выполнив следующие действия:

int many_booleans = -1; //All are true; 
int many_booleans = 0; //All are false; 
int many_booleans = 1 | 2 | 8; //Bits 1, 2, and 4 are true the rest are false; 

Так что теперь короткий состоит из 16 битов, так 16 + 16 = 32, который прекрасно подходит в пределах 32-битное целое число. Поэтому каждое значение int может состоять из двух коротких значений.

int two_shorts = value | (value2 << 16); 

Так что выше делает это значение является то, что между -32768 и 32767 или беззнаковое значение 0 - 65535. Таким образом, скажем, значение равняется -1, так как значение без знака это было 65535. Это будет означать бит с 1 по 16 включаются, но при фактическом выполнении математики учитывайте диапазон 0 - 15.

Итак, мы должны активировать биты 17 - 32. Таким образом, мы должны начать с чего-то большего, чем 15 бит. Итак, мы начинаем с 16 бит. Итак, взяв значение2 и умножив его на 65536, что «< < 16» делает. Теперь мы бы скажем значение2 составило 3 было бы OR-нута 3x65536 = 196608. Таким образом, наше целое значение будет равно 262143.

int assumed_value = 262143; 

так что давайте говорить, что мы хотим получить два 16bit целочисленных значений.

short value1 = (short)(assumed_value & 0xFFFF); //-1 
short value2 = (short)(assumed_value >> 16); //=3 

Также в основном мыслить побитовыми операторами как степенями 2. Это все, что они на самом деле. Никогда не смотрите на это с точки зрения 0 и 1. Я в основном разместил это, чтобы помочь любому, кто может столкнуться с этим поиском беззнаковых коротких или даже, возможно, многомерных массивов. Если есть какие-то опечатки, я извиняюсь, быстро написал это.

2

От 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); 
} 
0

При использовании сторонней библиотеки является вариант, есть jOOU (ответвление библиотека от jOOQ), которая предлагает типы обертки для целых чисел без знака в Java. Это не совсем то же самое, что поддержка примитивного типа (и, следовательно, байт-кода) для неподписанных типов, но, возможно, это все еще достаточно хорошо для вашего случая использования.

import static org.joou.Unsigned.*; 

// and then... 
UShort s = ushort(1); 

(Отказ от ответственности: Я работаю в компании, стоящей за этими библиотеками)

Смежные вопросы