АктОб /
ПреобразованиеТиповДва способа преобразования типов известны, но нигде не документированы. LONGINT(выражение), INTEGER(выражение) На 2012-11-26 можно преобразовывать таким способом числовые, адресные и размерные типы к числовым. Код, который этим занимается, можно найти по сообщению "invalid type in explicit conversion" (FoxSemanticChecker.Mod). Говорят, что позднее это обобщили. выражение(ТипЗаписи) по сообщению "no type extension of type" (FoxSemanticChecker.NewTypeGuardDesignator). Вот комментарий: (** return type guard designator left(type) - check if type can be extended (i.e. is no static record) - check if type is a type extension of left.type - returns new type guard designator returns invalidDesignator = invalidExpression if error **) В переводе:
В отчёте по оберону это называется typeguard и там описывается так:
Говорят, что это расширили. Потеря данных при преобразовании типов происходит. Нет ошибки при преобразованиях таких, как UNSIGNED16(значение типа UNSIGNED32), но как именно они теряются - неясно из-за того, что сломаны либо сами преобразования, либо печать :) Во всяком случае, CHR(число>256) просто отбрасывает старшие разряды, и если дать на вход код русского "Т", то получится двойная кавычка. См. также https://gitlab.com/budden/jaos/-/issues/31 - про странное преобразование 129 из UNSIGNED8 в SIGNED64 - получается огромное отрицательное число. |