Автор Тема: Семантика SHORT(x) в Компонентном Паскале  (Прочитано 33462 раз)

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #30 : Декабрь 23, 2012, 08:17:49 pm »
Дык оно и так пишется, вроде!

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #31 : Декабрь 23, 2012, 08:21:05 pm »
Дык оно и так пишется, вроде!
Тык да. Я к тому что там в WIKI это не написано...

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #32 : Декабрь 23, 2012, 08:22:54 pm »
Нет, оно и без опций пишется - так ведь трэпы работают и Kernel.SourcePos....

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #33 : Декабрь 23, 2012, 08:25:43 pm »
Да не. Я про то что там описания нет у srcpos  :)

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #34 : Декабрь 25, 2012, 06:19:00 am »
Очевидно, что первая строчка пишет (по замыслу авторов) младший байт кода ch, а вторая - старший байт.
Не совсем очевидно. Мне кажется, это может быть наследием какой-то исторической кодировки.
Например: символы 00-7F кодируются одним байтом, а 80-7FFF - двумя. При этом отрицательное значение байта указывает на сдвиг предыдущего.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #35 : Декабрь 25, 2012, 08:28:07 am »
Присоединяюсь к предыдущему оратору по поводу 80-7FFFF :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #37 : Декабрь 25, 2012, 03:25:15 pm »
Очевидно, что первая строчка пишет (по замыслу авторов) младший байт кода ch, а вторая - старший байт.
Не совсем очевидно. Мне кажется, это может быть наследием какой-то исторической кодировки.
Например: символы 00-7F кодируются одним байтом, а 80-7FFF - двумя. При этом отрицательное значение байта указывает на сдвиг предыдущего.
Может некоторые символы у них и кодируются одним байтом. Но обсуждаемый фрагмент кода последовательно извлекает из кода символа два байта (сначала младший, а затем старший) для того, чтобы передать их в процедуру WriteByte(). В контексте данного обсуждения только это и важно.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #38 : Декабрь 25, 2012, 03:30:38 pm »
Не мне судить, что важно, но говорить об очевидности замысла авторов, я бы поостерегся.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #39 : Декабрь 25, 2012, 03:42:22 pm »
Не мне судить, что важно, но говорить об очевидности замысла авторов, я бы поостерегся.
Извините, я никак не думал, что Вы этих авторов держите за идиотов.  ;)
Обе осуждаемые строчки ошибочны. Я, в отличие от Вас, полагал, что в замыслы авторов не входило  строчить ошибочный код, о чём и написал.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #40 : Декабрь 25, 2012, 03:58:55 pm »
Я не считаю эти строчки ошибочными.
И кто из нас держит авторов за идиотов?

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #41 : Декабрь 25, 2012, 04:01:28 pm »
Обе осуждаемые строчки ошибочны.
[offtop]
Всё-таки иногда бывает жаль, что нельзя поправить свои собственные сообщения.
В приведённой цитате имелось в виду слово "обсуждаемые".
[/offtop]

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #42 : Декабрь 25, 2012, 04:02:23 pm »
Я не считаю эти строчки ошибочными.
Т.е. переполнение это нормально для языка в котором это запрещено семантикой SHORT?

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #43 : Декабрь 25, 2012, 04:18:12 pm »
Я не считаю эти строчки ошибочными.
Без комментариев...  :o

И кто из нас держит авторов за идиотов?
У-фф... Ещё раз. Если включить все проверки, то первая строчка может вызвать переполнение. А вторая переполнение не вызовет, но при этом искажает значение байта. Я убеждён, что авторы НЕ СПЕЦИАЛЬНО допустили эти ошибки. Значит, они не идиоты.
(Мы все ошибаемся. Но только идиоты могут делать это нарочно.)

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #44 : Декабрь 26, 2012, 08:16:58 am »
В ББ хватает мест, где  SHORT используется для приведения значений. Типа такого:
PROCEDURE Write4 (x: INTEGER);
BEGIN
Ro.WriteByte(SHORT(SHORT(x MOD 256))); x := x DIV 256;
Ro.WriteByte(SHORT(SHORT(x MOD 256))); x := x DIV 256;
Ro.WriteByte(SHORT(SHORT(x MOD 256))); x := x DIV 256;
Ro.WriteByte(SHORT(SHORT(x MOD 256)))
END Write4;
И если включить все проверки, он скорее всего не заработает. Вероятно, авторы  понимают семантику SHORT несколько иначе.  :)
Хотя иногда случаются приступы семантической чистоты.
IF ORD(str[i]) > MAX(BYTE) THEN w.WriteByte(SHORT(SHORT(ORD(str[i]) - 256)))
ELSE w.WriteByte(SHORT(SHORT(ORD(str[i]))))
END;

В осуждаемых же строчках 128 вычитается явно намеренно, с какой-то неизвестной нам целью.