- Class Short
- Field Summary
- Constructor Summary
- Method Summary
- Methods declared in class java.lang.Object
- Field Details
- MIN_VALUE
- MAX_VALUE
- TYPE
- SIZE
- BYTES
- Constructor Details
- Short
- Short
- Method Details
- toString
- parseShort
- parseShort
- valueOf
- valueOf
- describeConstable
- valueOf
- decode
- Самый большой Java Short (32767) плюс 1 не становится отрицательным?
- 5 ответов
- Ещё вопросы
Class Short
The Short class wraps a value of primitive type short in an object. An object of type Short contains a single field whose type is short .
In addition, this class provides several methods for converting a short to a String and a String to a short , as well as other constants and methods useful when dealing with a short .
This is a value-based class; programmers should treat instances that are equal as interchangeable and should not use instances for synchronization, or unpredictable behavior may occur. For example, in a future release, synchronization may fail.
Field Summary
Constructor Summary
Method Summary
Returns the value obtained by reversing the order of the bytes in the two’s complement representation of the specified short value.
Returns a Short object holding the value extracted from the specified String when parsed with the radix given by the second argument.
Methods declared in class java.lang.Object
Field Details
MIN_VALUE
MAX_VALUE
TYPE
SIZE
BYTES
Constructor Details
Short
It is rarely appropriate to use this constructor. The static factory valueOf(short) is generally a better choice, as it is likely to yield significantly better space and time performance.
Short
It is rarely appropriate to use this constructor. Use parseShort(String) to convert a string to a short primitive, or use valueOf(String) to convert a string to a Short object.
Constructs a newly allocated Short object that represents the short value indicated by the String parameter. The string is converted to a short value in exactly the manner used by the parseShort method for radix 10.
Method Details
toString
parseShort
- The first argument is null or is a string of length zero.
- The radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX .
- Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign ‘-‘ ( ‘\u002D’ ) or plus sign ‘+’ ( ‘\u002B’ ) provided that the string is longer than length 1.
- The value represented by the string is not a value of type short .
parseShort
Parses the string argument as a signed decimal short . The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign ‘-‘ ( ‘\u002D’ ) to indicate a negative value or an ASCII plus sign ‘+’ ( ‘\u002B’ ) to indicate a positive value. The resulting short value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseShort(java.lang.String, int) method.
valueOf
Returns a Short object holding the value extracted from the specified String when parsed with the radix given by the second argument. The first argument is interpreted as representing a signed short in the radix specified by the second argument, exactly as if the argument were given to the parseShort(java.lang.String, int) method. The result is a Short object that represents the short value specified by the string. In other words, this method returns a Short object equal to the value of:
valueOf
Returns a Short object holding the value given by the specified String . The argument is interpreted as representing a signed decimal short , exactly as if the argument were given to the parseShort(java.lang.String) method. The result is a Short object that represents the short value specified by the string. In other words, this method returns a Short object equal to the value of:
describeConstable
valueOf
Returns a Short instance representing the specified short value. If a new Short instance is not required, this method should generally be used in preference to the constructor Short(short) , as this method is likely to yield significantly better space and time performance by caching frequently requested values. This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.
decode
Decodes a String into a Short . Accepts decimal, hexadecimal, and octal numbers given by the following grammar:
DecodableString: Signopt DecimalNumeral Signopt 0x HexDigits Signopt 0X HexDigits Signopt # HexDigits Signopt 0 OctalDigits Sign: — +
DecimalNumeral, HexDigits, and OctalDigits are as defined in section 3.10.1 of The Java Language Specification , except that underscores are not accepted between digits. The sequence of characters following an optional sign and/or radix specifier (» 0x «, » 0X «, » # «, or leading zero) is parsed as by the Short.parseShort method with the indicated radix (10, 16, or 8). This sequence of characters must represent a positive value or a NumberFormatException will be thrown. The result is negated if first character of the specified String is the minus sign. No whitespace characters are permitted in the String .
Самый большой Java Short (32767) плюс 1 не становится отрицательным?
Недавно я узнал о двух комплиментных методах представления как положительных, так и отрицательных целых чисел в базовой системе. Затем я попытался увидеть это в действии с помощью java со следующим коротким кодом:
int a=2147483647; System.out.println("a: "+a); System.out.println("a+1: "+(a+1)); short b=32767; System.out.println("b: "+b); System.out.println("b+1: "+(b+1));
Что меня смущает, потому что я думаю, что b + 1, будучи представленным в двоичном виде как 011111111111111, превратится в 1000000000000000, или в десятичное число, -32768. Что происходит?
5 ответов
Хотя b является коротким, выражение (b + 1) является int. Правильный операнд — это int, левый операнд продвигается до int, а выражение является продвинутым типом операндов.
- Если один из операндов имеет тип double, другой преобразуется в double.
- В противном случае, если любой операнд имеет тип float, другой преобразуется в float.
- В противном случае, если любой из операндов имеет тип long, другой преобразуется в long.
- В противном случае оба операнда преобразуются в тип int.
Обратите внимание, что это последнее продвижение происходит, даже если оба операнда имеют короткий тип. Вы не можете избежать продвижения в int с помощью (b + (short) 1) .
Тип аддитивного выражения для числовых операндов — это продвинутый тип его операндов.
Он описывает это в приведенной выше выдержке, но я хотел бы подчеркнуть, что short операнды повышаются до int , даже если оба являются short s. Так short a = 32767; short b = 1; System.out.println(a + b); будет по-прежнему печатать 32768 ; это немного удивительно, поэтому стоит явно об этом сказать.
1 является литералом int . Когда вы вычисляете b+1 , вы фактически продвигаете b на int , а затем добавляете 1 , в результате получим 32768 , что является совершенно законным значением int . Если вы снова сбросите его на short , вы увидите переполнение, которое вы ожидаете ( -32768 ):
System.out.println("b+1: " + (short)(b + 1));
Выполнение + автоматически продвигает short до int . Сделайте это, и вы увидите переполнение.
System.out.println("b+1: "+(short)(b+1)); //-32768
- Если один из операндов имеет тип double, другой преобразуется в double.
- В противном случае, если любой операнд имеет тип float, другой преобразуется держаться на плаву.
- В противном случае, если любой операнд имеет тип long, другой преобразован в длинный.
- В противном случае оба операнда преобразуются в тип int.
Обратите внимание на последнее правило, поэтому, по сути, это означает, что даже если они оба являются шортами, они будут повышены до int, этого избежать нельзя.
short b= 32767; short d= 12; System.out.println("b+1: "+ (d+b)); // 32779
И ответ будет по-прежнему действительным.
Как отмечали другие, добавление продвигает операнды до int .
Обратите внимание, что оператор += автоматически возвращает кастинг на short :
short b=32767; System.out.println(b + 1); // 32768, because of integer promotion. b += 1; // Equivalent to b = (short)(b + 1); System.out.println(b); // -32768
b++; / ++b; даст тот же результат, что и b += 1 .
Не нужно путаницы, попробуйте следующее:
short b = 32767; short c = b + 1;
Что вы получаете? Правильно, вы получаете:
ошибка: несовместимые типы: возможное преобразование с потерями из int в short short c = b + 1;
Итак, что происходит на вашей линии? System.out.println(«b+1: «+(b+1)); ?
Ну, b+1 слишком большой для short , как вы сказали правильно, но здесь вы добавляете int к нему, делая результат также int. И 32768 является допустимым int.
Как уже указывали другие, если вы явно опустили его на (short) , вы получили то, что вы просили.
С другой стороны, это не работает для short c = b + 1; , так как здесь объявленный тип является коротким, а фактическим типом является int .
short c = (short) (b + 1); решает, что «проблема»
@andy-turner andy-turner На самом деле я делаю: repl.it/GNMT/1 (то же самое в Scala с val c: Short = Short.MaxValue + 1 -> ошибка: несоответствие типов; найдено: Int, требуется: Short)
Говорили слишком рано 🙂 Да, я проверил и тоже нашел. Это удивляет меня; Я бы подумал, что автоматическая проверка сужения постоянных значений позволит узнать, что предупреждение не нужно.
Аааа, понятно Поскольку постоянное значение определенно не вписывается в short диапазон, вы все равно получаете предупреждение. Вы не получите предупреждение для final short b = 32766; ,
Ещё вопросы
- 0 Возможные причины множественного определения символа, отличного от ‘extern’
- 0 JQuery обход и поиск текстовых полей
- 0 Нужен запрос для сортировки значений из одной таблицы на основе значений другой
- 0 Компилировать вложенные директивы в модульном тесте в Angular
- 0 Ошибка при создании нового пользователя с PHP SDK
- 0 Тайм-аут истек -> Невозможно подключиться к любому из указанных хостов MySQL
- 1 Добавить метку внутри элемента управления textbox
- 1 Ускорьте поиск и вставьте в параллельную сумку c #
- 1 d3.behavior.zoom () перемещает график в угол вместо центра
- 0 Свежие данные MySQL через запрос с использованием Python
- 1 Как я могу разобрать каждую строку хранится в одной переменной
- 0 Медиа-запрос css3 не работает в IE ниже ie10
- 0 Возврат через все функции
- 1 Повторение вызова метода
- 0 MYSQL: выбор идентификатора с максимальным целочисленным значением в другом поле
- 1 Доступ к PropertySources в приложении Spring 3.1 xml
- 0 C ++ — Использование ofstream для создания файла в другом каталоге?
- 1 Игра Python Heads или Tails, не отображается, кроме пункта
- 0 проверка формы зависит от другого поля
- 1 Как разрешить исключение com.android.builder.dexing.DexArchiveBuilderException?
- 0 PHP time () для Date / Time, возвращающих странные результаты
- 1 Инициализируйте локальную или динамическую переменную DateTime
- 0 GLUT взаимодействие с мышью
- 1 KnockoutJS — показать накопленную стоимость для каждого элемента
- 1 Как добавить строку в сценарии Java с предварительным увеличением в той же строке
- 0 Код CodeIgniter работает в браузере, умирает в тесте phpunit: вызов неопределенного метода CI_DB_mysql_driver :: where () в (… privacy ..) users.php в строке 36
- 0 Проверка формы доступа извне
- 1 Как сказать Python HTMLParser остановиться
- 1 Сбой экземпляра Python (obj, tpyes.GeneratorType)
- 0 Как автоматически воспроизводить YouTube видео в HTML iframe в iphone
- 0 JQuery, нажмите, чтобы увеличить изображение, затем нажмите Agian, чтобы вернуться к предыдущей ширине
- 0 Как работает этот блок блокировки?
- 1 Разобрать данные Json в объект Json
- 0 Как добавить сервисную ссылку в библиотеку C #?
- 0 Авто-увеличение при изменении ориентации в iOS 7
- 0 JQuery обратный вызов, когда 3 метода завершены?
- 0 XML-данные в запрос вставки / обновления MySQL, используя PHP
- 1 Как получить доступ к нескольким ресурсам xsl для тега int-xml: xslt-transformer?
- 0 Как это работает сценарии JQuery для загрузки содержимого Grom AJAX?
- 1 Как правильно читать числовые данные (сохраненные в текстовом файле) в Python?
- 0 Невозможно создать запрошенный сервис [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] (при попытке использовать EntityManager)
- 1 Repl.it javascript classroom — бесконечный цикл
- 1 Управляемые событиями веб-приложения на Java?
- 0 вектор push_back не работает
- 0 Angular Template Cache — Очистить кэш для обновленного шаблона
- 1 Я не понимаю, как я получаю этот вывод (в цепочке операторов)
- 0 MVC ListBox Выбранный элемент в Jquery Load функция
- 1 Динамическая последовательность точек GPS вдоль дороги
- 0 Добавление дополнительных строк в индекс PHP при попытке увеличить элемент
- 0 Жасмин Тест — Неизвестный поставщик $ sceProvider