Может кто-нибудь объяснить, почему следующее не компилируется?
byte b = 255 << 1
Ошибка:
Постоянное значение '510' не может быть преобразовано в 'byte'
Я ожидаю следующее в двоичном формате:
1111 1110
Преобразование типа превзошло меня.
Может кто-нибудь объяснить, почему следующее не компилируется?
byte b = 255 << 1
Ошибка:
Постоянное значение '510' не может быть преобразовано в 'byte'
Я ожидаю следующее в двоичном формате:
1111 1110
Преобразование типа превзошло меня.
Числовые литералы в С# равны int
, а не byte
(и сдвиг бит будет оцениваться компилятором, поэтому останется только 510). Поэтому вы пытаетесь присвоить значение byte
, которое не подходит. Вы можете замаскировать 255:
byte b = (255 << 1) & 0xFF
чтобы снова уменьшить результат до 8 бит. В отличие от Java, С# не позволяет переполнениям оставаться незамеченными. В основном у вас есть две разумные опции при попытке назначить 510 байту: либо зажать максимальное значение, то вы получите 255, либо выбросите биты, которые не подходят, и в этом случае вы получите 254.
Вы также можете использовать unchecked
, как lassevk:
byte b = unchecked((byte)(255 << 1));
Вы перемещаете 255 на 1 бит, а затем пытаетесь присвоить его байту.
255 << 1 is 510
, а 510 не будет помещаться в байт.
byte b = 0xff & (255 << 1);
Результатом оператора <<
является Int32
, а не то, что вы в него вложили.
Вам нужно передать результат сдвига, а не ввод. Кроме того, это приведет к переполнению (оно больше байта afterall), поэтому вам нужно указать, что вам нужен неконтролируемый отбор.
Другими словами, это будет работать:
Byte b = unchecked((Byte)(255 << 1));
255 << 1
предоставит вам более одного байта.
Вы пробовали лить его?
byte b = (byte)(255 << 1)
Это интересный подход - приведенный выше код будет работать, если он заключен в блок unchecked
следующим образом:
unchecked
{
byte b = (byte)(255 << 1);
}
Так как это unchecked
, значение усекается до предполагаемого значения 254. Таким образом, это можно сделать с помощью cast!
И так как < < имеет более высокий приоритет, чем и вы можете сохранить скобки:
byte b = 255 << 1 & 0xff;