我使用-Criot -gl
标志编译了程序,而不是1我得到了很多结果(事实上,我正在寻找修复216错误)。第一个是下面的代码,它是一个简单的散列函数。我不知道如何解决这个问题。
function HashStr(s : string) : integer;
var h : integer;
var c : char;
begin
h := 0;
for c in s do
h := ord(c) + 31 * h; { This is the line of error }
HashStr := h;
end;
这怎么可能超出范围?
答案 0 :(得分:2)
很简单,说你有一个字符串“zzzzzzzzzzz”。 Ord(c)将为122,因此序列为
H = 122 + (31* 0 ) = 122
H = 122 +(31*122) = 3902
H = 122 +(31*3902) = 121146
超过了16位整数的32767限制,如果它是32但是int,则不会需要更多的迭代来超过该限制。