Различие между подписанным и неподписанным практически - PullRequest
0 голосов
/ 11 мая 2019

Я искал и читал много предыдущих ответов, касающихся этой разницы, но я до сих пор не получил кое-что, например, с этой строкой кода:

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111111111", 2));

Я прочитал, что без знака может быть больше положительногозначение, а не отрицательное значение.Неподписанный использует начальный бит как часть значения, в то время как подписанная версия использует самый левый бит, чтобы определить, является ли число положительным или отрицательным.целые числа со знаком могут содержать как положительные, так и отрицательные числа.Unisgned может идти больше, чем MAX_VALUE, так почему этот sysout дает -1, что отрицательно.И для этой строки код:


System.out.println(Integer.parseInt("11111111111111111111111111111111", 2));

Почему эта строка выдает ошибку (32 раза 1)?Разве подписанное int не предполагает, что первая 1 - это минус, а остальные 31 - как положительное значение?(так должно быть - MAX_VALUE)

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Java не имеет целочисленных типов без знака.Когда вы вызываете parseUnsignedInt, он не возвращает целое число без знака, потому что в java такого нет.

Вместо этого parseUnsignedInt анализирует ввод как 32-разрядный без знаказначение, а затем возвращает знаковое 32-битное значение с теми же битами .

Если вы предоставите ему число, в котором начальный бит установлен в его без знакапредставление, поэтому он будет возвращать отрицательное число, потому что все числа со знаком с этим набором битов являются отрицательными.

0 голосов
/ 11 мая 2019

Неподписанный может быть больше, чем MAX_VALUE, так почему же этот sysout дает -1, что отрицательно.

Integer содержит 32-битное значение. Результатом parseUnsignedInt (32 однобитных, 2) является значение со всеми установленными битами. Что это «значит», в глазах смотрящего. Большая часть Java считает целочисленные значения подписанными. Например, средство форматирования, используемое println, считает значение подписанным, и в результате получается -1.

Все, что у вас есть в «Integer», это 32-битное значение. parseUnsignedInt () обрабатывает свой входной аргумент специально, но затем он должен сохранить результат в стандартном Integer. Нечего сказать, что биты должны быть «без знака». Если вы хотите трактовать значение как беззнаковое, вы не можете использовать что-либо, что обрабатывает его как подписанное, поскольку в Java действительно нет целочисленного типа без знака.

Разве подписанный int не предполагает, что первая 1 считается минусом, а другие 31 1 как положительное значение? (так должно быть - MAX_VALUE)

См. Другой ответ для этой части.

Представление, которое, я думаю, вы ожидали, когда старший бит указывает знак, а остальные биты указывают (положительное) значение, называется представлением «знак и величина». Я не знаю ни одного текущего компьютера, который использует знак и величину для своих целых чисел (возможно, это произошло в самые ранние дни, в 1950-х или около того, когда люди начали разбираться с этим).

0 голосов
/ 11 мая 2019

Почему эта строка выдает ошибку (32 раза 1)?Разве подписанное int не предполагает, что первая 1 - это минус, а остальные 31 - как положительное значение?(поэтому он должен давать - MAX_VALUE)

Он выбрасывает NumberFormatException по той же причине, что и

Integer.parseInt("2147483648", 10)

.Строка не представляет число, которое может быть представлено как int при интерпретации в соответствии с заданным основанием.То, что int использует 32 бита для представления значений, связано только с периферией.Если вы хотите проанализировать отрицательное значение с помощью Integer.parseInt(), тогда строка должна содержать начальный знак минуса:

Integer.parseInt("-1111111111111111111111111111111", 2)

или даже

Integer.parseInt("-10000000000000000000000000000000", 2)  // note: 32 digits

Метод не отображает биты непосредственно вint представление.Он интерпретирует строку как текстовое представление числа.

...