Сообщение от Rise
|
Malleys, почему тогда '-1011' куда делись 245 и 11110101 ?
|
Никуда. Двоичное 11110101 это десятичное 245, но если воспринимать его как 8 битовое число, то оно означает десятичное -11.
Если -11 перевести в двоичную систему, получим -1011.
Сообщение от Rise
|
Для представления отрицательного двоичного числа нашел такое:
alert( (-11 >>> 0).toString(2) );
alert( parseInt('11111111111111111111111111110101', 2) >> 0 );
|
Предложенный Вами способ приводит к неоднозначности:
alert((-11 >>> 0).toString(2) == '11111111111111111111111111110101');
alert((-4294967307 >>> 0).toString(2) == '11111111111111111111111111110101'); // Перевод разных чисел соответствует одному и тому же числу...
Зачем вы используете для перевода чисел в двоичную систему побитовый сдвиг вправо, если он при этом конвертирует числа в 32-х битовые???
По сути вы находите остаток от деления на 2^32.
alert((-30064771072 >>> 0).toString(2)); // переводит неверно
alert((-30064771072).toString(2)); // переводит верно
1.25 = 1 * 2^0 + 0 * 2^(-1) + 1 * 2^(-2) = двоичное 1.01
alert((1.25 >>> 0).toString(2)); // переводит неверно
alert((1.25).toString(2)); // переводит верно
Почему ~10..toString(2) дает -1011?
Потому что -11 представлено в виде суммы степеней двойки и выписаны коэффициенты.
Почему ~10 даёт -11, а не двоичное 11111111111111111111111111110101?
Потому что операнды всех битовых операций конвертируются в 32-х битовые целые со знаком представленные в дополнительном бите.
Таким образом однозначно могут быть представлены целые числа от 0 до 2147483647 и от -2147483648 до -1, с оговоркой, что они 32-х битовые.