Посмотрите http://en.wikipedia.org/wiki/Two%27s_complement и узнайте немного о булевой алгебре и логическом дизайне. Изучение того, как считать в двоичном и сложение и вычитание в двоичном коде, объяснит это далее.
Язык C использовал эту форму чисел, чтобы найти наибольшее количество, которое вам нужно использовать 0x7FFFFFFF. (где вы используете 2 FF для каждого байта, а самый левый байт - 7.) Чтобы понять это, вам нужно искать шестнадцатеричные числа и то, как они работают.
Теперь, чтобы объяснить неподписанный эквивалент. В подписанных числах нижняя половина чисел отрицательна (0 считается положительной, поэтому отрицательные числа на самом деле считают 1 выше положительных чисел). Беззнаковые числа положительны. Поэтому теоретически ваше наивысшее число для 32-битного int равно 2^32, за исключением того, что 0 все еще считается положительным, так что это фактически 2^32-1, теперь для подписанных чисел половина этих чисел отрицательна.что означает, что мы делим предыдущее число 2^32 на 2, так как 32 является показателем, мы получаем 2^31 чисел на каждой стороне 0, положительный означает, что диапазон подписанного 32-битного int равен (-2^31, 2^31- 1).
Теперь просто сравнивающие диапазоны: 32 бит без знака INT: (0, 2^32-1) подписал 32 бит INT: (-2^31, 2^32-1) беззнаковое 16 бит INT: (0 , 2^16-1) подписан 16 бит int: (-2^15, 2^15-1)
вы должны быть в состоянии увидеть рисунок здесь. , чтобы объяснить, что вещь ~ 0 занимает немного больше, это связано с вычитанием в двоичном формате. это просто добавление 1 и переворачивание всех бит, а затем добавление двух чисел вместе. C делает это за кулисами, и поэтому многие процессоры (включая строки процессоров x86 и x64). Из-за этого лучше всего хранить отрицательные числа, как если бы они отсчитывали, а в двух дополнениях добавленный 1 также скрытый. Потому что 0 считается положительным, поэтому отрицательные числа не могут иметь значение для 0, поэтому они автоматически добавляют к ним -1 (положительный 1 после бит-флип). при декодировании отрицательных чисел мы должны учитывать это.
Вы уверены, что знаете, что оператор ~ делает? (Побитовое NOT) –
Ну, '-1' - это максимальное число, которое вы можете поместить в целое число, но с _maximum_, определяемым как двоичное значение absoltue :) –