Есть ли что-то особенное в номере 65535?

11

2¹⁶-1 & 2⁵ = 2⁵ (или? Очевидно?)

Разработчик спросил меня сегодня, что поразрядно 65535 & 32 то есть 2¹⁶-1 & 2⁵ =? Сначала я подумал, что спонтанно 32, но мне показалось, что легко, после чего я думал несколько минут, а затем ответил 32. 32 кажется правильным, но как? 65535 = 2¹⁶-1 = 1111111111111111 (но это не кажется правильным, так как все двоичные числа должны быть -1 (?)), 32 = 100000, но я не мог преобразовать это в своей голове, после чего я все равно ответил 32, так как у меня было ответить на что-то. Действительно ли ответ 32 тривиален? Точно так же 2¹⁶-1 и 2⁵-1 = 31? Почему разработчик спросил меня о именно 65535?

Двоичное значение, которое меня попросили оценить, было 1111111111111111 & 100000, но я не понимаю, почему 1111111111111111 не равно -1. Разве это не должно быть -1? 65535 - число, которое дает переполнение, и как я узнаю это?

Никлас
источник
3
Там должно быть что-то особенное. Это напоминает мне 56 6635, чешский национальный стандарт на пиво. Хм ... время для пива.
Joshp
5
Вы делаете слишком много предположений: 65535 дает -1 только в 16-битной двоичной арифметике дополнения. Он дает -0 в 16-битной арифметике с дополнением и 65535 в 32-битной арифметике с дополнением до двух и дополнением к одному.
Mouviciel
3
Это верхний предел портов TCP.
Рене Лидер

Ответы:

23

В этом случае число рассматривается как целое число без знака, что означает, что все установленные биты не будут давать -1 (если оно было подписано, тогда да, вы были бы правы). Таким образом, все 16 установленных битов дадут вам 65535.

Интересно, что подписанное состояние не является фактором при выполнении логических битовых операций. Сами биты не подписаны, поскольку они являются самым низким компонентом в компьютере. Это определяется операцией процессора, если биты в ex. регистр будет считаться подписанным или неподписанным.

Отрицательные числа производятся путем установки старшего значащего бита (MSB) в значение true, ЕСЛИ число рассматривается как знаковое (какая «сторона» или какой внешний бит будет установлен, зависит от архитектуры ЦП, т. Е. Big-endian / little-endian )

epistemex
источник
9
Большинство современных машин конвертируют в отрицательные, переворачивая биты и добавляя 1: 2. Установка одного бита дает вам проблему наличия +0 и -0.
Джеймс
1
Это не обязательно проблема. Дополнение 1 усекается до нуля, независимо от знака результата. Комплемент 2 усекается в направлении -infinity. В некоторых приложениях это может привести к неприятностям.
Джон Р. Штром
18

Это является тривиальным. 65535 в двоичном коде - это все единицы, поэтому AND с любым X меньше 65535 даст вам X.

ggambett
источник
10

Отвечая на вторую часть вашего вопроса. Вы пометили его как так что 65535 в 32-битном 00000000000000001111111111111111, подписан или без знака, это не -1.

Крис Кент
источник