Тута решил написать програмку, дабы потестить это
- Код: Выделить всё
 {$MODE OBJFPC}
type
  trec = record
    af,bf: Smallint;
  end;
procedure getab(rec: trec; var a,b);
begin
  //Smallint(a) := rec.af; Smallint(b) := rec.bf
  Longint(a) := rec.af; Longint(b) := rec.bf
end;
procedure check_byte(tst: trec);
var
  ta: Byte = 0;
  tb: Byte = 0;
begin
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_word(tst: trec);
var
  ta: Word = 0;
  tb: Word = 0;
begin
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := 65535; tb := 65535;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_sint(tst: trec);
var
  ta: Smallint = 0;
  tb: Smallint = 0;
begin
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := -32768; tb := 32767;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_lint(tst: trec);
var
  ta: Longint = 0;
  tb: Longint = 0;
begin
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := -32768; tb := 32767;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := -2147483648; tb := 2147483647;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_lword(tst: trec);
var
  ta: Longword = 0;
  tb: Longword = 0;
begin
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := -32768; tb := 32767;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ' ');
  ta := 4294967295; tb := 4294967295;
  getab(tst,ta,tb);
  write((ta = tst.af) AND (tb = tst.bf), ';');
end;
Type
  TCheckt = procedure(tst: trec);
const
  tst: array[0..6] of trec = 
                       (
                         (af:0;bf:0),
                         (af:1;bf:3),
                         (af:-3;bf:-1),
                         (af:2047;bf:2047),
                         (af:-2048;bf:-2048),
                         (af:32767;bf:32767),
                         (af:-32768;bf:-32768)
                       );
var
  i: Longint;
  cfn: TCheckt;
begin
  writeln('Byte:');
  cfn := @check_byte;
  for i := 0 to 6 do
    cfn(tst[i]);
  writeln;
  writeln('Word:');
  cfn := @check_word;
  for i := 0 to 6 do
    cfn(tst[i]);
  writeln;
  writeln('Smallint:');
  cfn := @check_sint;
  for i := 0 to 6 do
    cfn(tst[i]);
  writeln;
  writeln('Longint:');
  cfn := @check_lint;
  for i := 0 to 6 do
    cfn(tst[i]);
  writeln;
  writeln('Longword:');
  cfn := @check_word;
  for i := 0 to 6 do
    cfn(tst[i]);
  writeln;
end.
Ее вывод
- Код: Выделить всё
 Byte:
TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;
Word:
TRUE TRUE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;
Smallint:
TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;
Longint:
TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;
Longword:
TRUE TRUE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;
Вроде все правильно, ошибки если record поля больше тестируемых переменных, а также если поля отрицательные, в то время как переменные беззнаковые.
если в коде поменять:
procedure getab(rec: trec; var a,b);
begin
  //Smallint(a) := rec.af; Smallint(b) := rec.bf
  Longint(a) := rec.af; Longint(b) := rec.bf
end;
на
procedure getab(rec: trec; var a,b);
begin
  Smallint(a) := rec.af; Smallint(b) := rec.bf
  //Longint(a) := rec.af; Longint(b) := rec.bf
end;
Получаются явные ошибки, если переменные инициализированы не нулевыми значениями, то есть остается мусор.
Прошу прощения за длинный код, он вообще то не сложный, пускай это будет ответом тем, кто предлагает использовать перегрузку, тем более, что что потребности в этом нет.