29 or -49высчитать pascal По возможности объяснить, как высчитать это с помощью...

0 голосов

29 or -49
высчитать
pascal
По возможности объяснить, как высчитать это с помощью калькулятора, ибо паскаль выдает 223, а калькулятор -33.


спросил от Начинающий (109 баллов) в категории Информатика
оставил комментарий от Отличник (9.2k баллов)

Вы знаете, почему 4294967247 и -49 это одно и то же?

оставил комментарий от Начинающий (109 баллов)

задание писал выше

оставил комментарий от Начинающий (109 баллов)

секунду

оставил комментарий от Отличник (9.2k баллов)

Напиши задание полностью.

оставил комментарий от Бакалавр (10.8k баллов)

Эникей сейчас решит и посмотрим

оставил комментарий от Бакалавр (10.8k баллов)

Возможно надо все делать в шортинт, и в конце преобразавать число в байт

оставил комментарий от Отличник (9.2k баллов)

А как 207 or 29 = 223 надеюсь объяснять не надо?

оставил комментарий от Отличник (9.2k баллов)

Если 4294967247 обрезать до byte, получится 207

оставил комментарий от Начинающий (109 баллов)

согласен, с shortint всё работает верно, но я в замешательстве, ибо не понимаю что ставить в контр. значение. -33 или то, что высчиталось паскалем 223...

оставил комментарий от Отличник (9.2k баллов)

Будет произведено вычисление с операндами типа integer, а результат обрезан до byte.

2 Ответы
0 голосов
ответил от БОГ (150k баллов)
 
Лучший ответ

Переменные типа shortint хранят данные в дополнительном коде. Разрядность - 8 бит, диапазон представления данных -128₁₀ - 127₁₀, самый левый бит - знаковый.
Переменные типа byte хранят данные в прямом коде. Разрядность 8 бит, диапазон представления данных 0 - 255₁₀, знаковый бит отсутствует.

Число 29₁₀ = 00011101₂ и в таком виде оно помещается в shortint.
Число -49₂ = -00110001₂ и оно помещается в shortint в дополнительном коде как 11001111₂
Операция or в языке Pascal осуществляется поразрядно.
    00011101
∨ 11001111
---------------
    11011111
Эта последовательность бит, если её рассматривать как shortint, соответствует числу -33 в дополнительном коде.
Но если её переписать в восьмибитное поле, рассматриваемое как беззнаковое целое (т.е. тип byte), ее значение будет равно 223₁₀

оставил комментарий от Начинающий (109 баллов)

ок

оставил комментарий от Начинающий (109 баллов)

верно

оставил комментарий от Начинающий (109 баллов)

всё таки самый разъяснённый ответ.

оставил комментарий от Отличник (9.2k баллов)

верно, Roman?

оставил комментарий от Отличник (9.2k баллов)

человек не понимает, как отрицательные числа представляются в дополнительном коде

оставил комментарий от Отличник (9.2k баллов)

самый левый бит - знаковый, а не байт

0 голосов
ответил от Отличник (9.2k баллов)

Все зависит от типа переменных!

var a: smallint;
var b: integer;
var c: cardinal;
var d: byte;

begin
        a := 29 or -49;
        b := 29 or -49;
        c := 29 or -49;
        d := 29 or -49;

        writeln('smallint: ', a);
        writeln('integer: ', b);
        writeln('cardinal: ', c);
        writeln('byte: ', d);
end.

smallint: -33
integer: -33
cardinal: 4294967263
byte: 223


оставил комментарий от Отличник (9.2k баллов)

4294967263 and 255 и будет как раз 223

оставил комментарий от Отличник (9.2k баллов)

Вот при чем тут разрядности.

оставил комментарий от Отличник (9.2k баллов)

Если тип переменной - беззнаковое целое разрядностью 8 бит (byte).

оставил комментарий от Начинающий (109 баллов)

да при чем тут разрядности... Дело в том, что мне нужно просто понять, как именно паскаль высчитал, что 29 OR -49 будет 223, а калькулятор выдал -33

...