0

我用标志编译了程序,-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;

这怎么可能超出范围?

4

1 回答 1

2

很容易,假设你有一个字符串“zzzzzzzzzzzz”。Ord(c) 将是 122,所以序列是

 H = 122 + (31* 0 ) = 122
 H = 122 +(31*122) = 3902
 H = 122 +(31*3902) = 121146

这超过了 16 位整数的 32767 限制,如果它是 32 位整数,则不需要更多的迭代来超过该限制。

于 2013-12-20T22:57:46.060 回答