Выход из доступного диапазона при использовании побитовой операции - Free Pascal
Формулировка задачи:
Тип Byte вмещает в себя 8 бит, в данной программе я узнаю число, как оно выглядит в двоичном коде, Для этого я число 7 (грубо говоря) умножаю на (знак доллара это переход к шестнадцатеричной системе) 8=1000(ДК) + 0=0000(ДК), т. е умножаем на 10000000, если получается то, на что машина умножает ,то пишем единицу, если нет, то 0. Затем смещаем старший бит(после проверки) влево.
Вопрос= Почему с типом данных Byte(8бит) выдает, что выходит из доступного диапазона, а если A:Integer, то все компилится нормально и выдает 00000111, что и следовало ожидать. Но блин, ведь Интеджер это 16 бит, а я проверяю 8 бит. Короче, кто понял почему не правильно с Byte, объясните пожалуйста.
Var A:Byte; I:0..8; Begin A:=7;{00000111} For I:=1 to 8 do begin If (A and $80)=$80 then {00000111 and(*) 10000000 =10000000} Write('1') Else Write('0'); A:=A shl 1; end; ReadLn; End. {Esli A:Byte to => exitcode 201, a s integer=компилиться}
Решение задачи: «Выход из доступного диапазона при использовании побитовой операции»
textual
Листинг программы
mask:=$80; For I:=1 to 8 do begin If (A and mask)<>0 then {00000111 and(*) 10000000 =10000000} Write('1') Else Write('0'); mask:=mask shr 1; end;
Объяснение кода листинга программы
- Переменная
mask
инициализируется значением $80. - Запускается цикл от 1 до 8.
- В каждой итерации цикла выполняется побитовая операция
and
между переменнойA
и маской, и результат сравнивается с 0. - Если результат не равен 0, то выводится
1
, иначе выводится0
. - После выполнения операции
and
и вывода результата, маска сдвигается вправо на 1 бит. - Цикл завершается после 8 итераций.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д