Тута решил написать програмку, дабы потестить это
- Код: Выделить всё
- {$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;
Получаются явные ошибки, если переменные инициализированы не нулевыми значениями, то есть остается мусор.
Прошу прощения за длинный код, он вообще то не сложный, пускай это будет ответом тем, кто предлагает использовать перегрузку, тем более, что что потребности в этом нет.