на оберонкоре это решают просто ))
С BYTE в Блэкбоксе можно сделать так:
PROCEDURE SignedToUnsigned (x: BYTE): INTEGER;
VAR ch: CHAR;
BEGIN
ch := CHR(x);
RETURN ORD(ch);
END SignedToUnsigned;Временная переменная ch: CHAR; обязательна. Если подставить напрямую ORD(CHR(x)), то компилятор соптимизирует и возвратит отрицательное число при отрицательном x.
Я конечно зануда, но я не поленился, и проверил. Вначале я сходил в доку по КП (cюда:
http://plas.fit.qut.edu.au/gpcp/LanguageReport.aspx#Type ), выяснил, что char он таки 16ти битный в КП (вне зависимости от реализации), а байт это натурально sint8. И тут то у меня и закрались подозрения.
Сходил и пощупал что у нас выйдет на плюсах:
#include <iostream>
#include <stdint.h>
using namespace std;
int main()
{
int_least8_t b = -15;
cout << (int_least32_t)(uint_least16_t)b;
return 0;
}
Получил естественны на выходе не 241 как ожидалось, а совсем даже 65521. Оке-ей. Скачал себе ББ. Проверил:
MODULE ObxHello0;
IMPORT StdLog;
PROCEDURE SignedToUnsigned (x: BYTE): INTEGER;
VAR ch: CHAR;
BEGIN
ch := CHR(x);
RETURN ORD(ch);
END SignedToUnsigned;
PROCEDURE Do*;
BEGIN
StdLog.Int(SignedToUnsigned(-15));
END Do;
END ObxHello0.
Получил в логе те же самые 65521. Так что этот метод не позволяет засунуть в integer тот самый uint8.
Чтобы работало как надо, в КП нужно немножко допилить:
PROCEDURE SignedToUnsigned (x: BYTE): INTEGER;
VAR ch: CHAR;
BEGIN
ch := CHR(x);
RETURN ORD(BITS(ORD(ch)) * {0,1,2,3,4,5,6,7});
END SignedToUnsigned;
И тогда все хорошо.
PS. Проверил на счет оптимизации - в ББ действительно компилятор кривой, оптимизацию он делает не верно. На выходе получается -15.