Отрицательные числа занимают больше памяти?

Итак, у меня есть эта тестовая программа, которая проверяет двоичное значение целого числа, одно положительное, а другое отрицательное.

int i = 100;
int i2 = -100;

System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(i2));

результат:

1100100
11111111111111111111111110011100

Как вы могли видеть, отрицательное число имеет больше бит, чем положительное число, означает ли это, что отрицательное число занимает больше памяти, чем положительное число?

4 ответа

Решение

Нет, это то, как оно представляется внутренне, с положительным числом у него такое же количество бит для представления значения int

это просто избегание ведущих нулей

Нет, оба являются 32-битными величинами - ширина целого числа фиксирована на данной платформе. Это "короче", потому что оно усекает все ведущие 0.

Возможно, вы захотите прочесть о целочисленном представлении, в частности, представлении дополнения до двух.

Нет, не будет. Максимальный нижний и верхний предел для целого числа (int) в Java составляет от -2 147 483 648 до 2 147 483 647. Помните, что int занимает 4 байта (32 бита).

Давайте поместим это в двоичный файл сейчас.. Это:

1111111 11111111 11111111 11111111 
 7 bits  8 bits   8 bits   8 bits

Всего это 31 бит (в первом столбце всего 7 бит). Оставшийся один бит является битом знака - бит знака обозначает знак. Если установлено (т.е. 1), оно отрицательное, если нет - положительное.

Так что для положительного числа (макс) это будет

01111111 11111111 11111111 11111111 

и для негатива это будет

11111111 11111111 11111111 11111111 

Таким образом, размеры будут одинаковыми.

Такие языки, как C,C++ и C# - поддерживают целые числа без знака (uint), которые также являются 32-битными и имеют диапазон от 0 до 4 294 967 295. Он отбрасывает бит знака и считает его в.

Нет. Номера потребляют одинаковое количество бит внутри, когда вы звонили toBinaryString() это удалило ведущие нули. В соответствии с Javadoc,

Это значение преобразуется в строку цифр ASCII в двоичном формате (основание 2) без дополнительных начальных 0.

Наконец, вы можете проверить Integer.SIZE,

System.out.println(Integer.SIZE);

Выход

32

Потому что Java int 32-битный

Другие вопросы по тегам