1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
{$mode objfpc}
uses sysutils;
{$ifndef FPC}
{$define ENDIAN_LITTLE}
{$endif}
type
int64rec = record
{$ifdef ENDIAN_LITTLE}
lo,hi:
{$else }
hi,lo :
{$endif}
cardinal;
end;
var
haserror,
error: boolean;
b: byte;
s: shortint;
i: smallint;
w: word;
l: longint;
c: cardinal;
t: int64;
q: qword;
{$r+}
begin
haserror := false;
b := 255;
t := b;
q := b;
b := 0;
t := b;
q := b;
s := 127;
t := s;
q := s;
s := -128;
t := s;
try
error := true;
q := s;
except
error := false;
end;
haserror := haserror or error;
w := 0;
t := w;
q := w;
w := 65535;
t := w;
q := w;
i := 32767;
t := i;
q := i;
i := -32768;
t := i;
try
error := true;
q := i;
except
error := false;
end;
haserror := haserror or error;
c := 0;
t := c;
q := c;
c := $ffffffff;
t := c;
q := c;
l := -maxlongint-1;
t := l;
try
error := true;
q := l;
except
error := false;
end;
haserror := haserror or error;
l := maxlongint;
t := l;
q := l;
q := 0;
t := q;
with int64rec(q) do
begin
lo := 0;
hi := $ffffffff;
end;
try
error := true;
t := q;
except
error := false;
end;
haserror := haserror or error;
with int64rec(t) do
begin
lo := 0;
hi := $80000000;
end;
try
error := true;
q := t;
except
error := false;
end;
haserror := haserror or error;
with int64rec(t) do
begin
lo := $ffffffff;
hi := $7fffffff;
end;
q := t;
if haserror then
begin
writeln('64bit range checking still buggy!');
halt(1);
end;
end.
|