В случае signed integer
самый левый бит устанавливает знак , поэтому диапазон значений, которые может иметь этот элемент типа, составляет от -2147483648 до 2147483647 .Чтобы получить отрицательное значение из положительного значения, вы делаете бит, обратный ко всем битам, и наоборот.
В случае unsigned integer
, самый левый бит используется для хранения дополнительных значений.Таким образом, диапазон значений, который может иметь этот элемент типа, составляет от 0 до 4294967295 .
В двоичной форме, когда i=1;
и вы только делаете i = i*2;
, тогда значения, которые вы можете иметьв качестве значений:
1 // 1 in base 10
10 // 2 in base 10
100 // 4 in base 10
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000
100000000000000000000
1000000000000000000000
10000000000000000000000
100000000000000000000000
1000000000000000000000000
10000000000000000000000000
100000000000000000000000000
1000000000000000000000000000
10000000000000000000000000000
100000000000000000000000000000
1000000000000000000000000000000 // 1073741824 in base 10
10000000000000000000000000000000 // 2147483648 in base 10
Теперь, если у вас есть цикл, подобный: while (i > 0) {
и i
действует, как описано выше, тогда он будет в бесконечном цикле, поскольку он никогда не будет равен 0.Переполнения произойдут, но ваша программа не будет тормозить - она все еще будет работать.
В случае, если переменная i
подписана (по умолчанию), вы получите вывод c=32
в виде целого числа 10000000000000000000000000000000 с оценкой -2147483648и это < 0
.Однако в этом случае вы не знаете выходных данных.
Поскольку это школьная работа, то, естественно, учителя выбрали проблему, из-за которой вы ничего не можете сделать, выполнив предоставленный код.Я предполагаю, что это потому, что вы хотите, чтобы вы знали, как хранятся нижележащие типы и в чем разница между типами со знаком и без знака.
В качестве дополнительного факта в Java нет неподписанных примитивов или классов неизменяемых чисел.В некоторых случаях их отсутствие может быть болезненным.Это определенно полезное ключевое слово.