+ -
当前位置:首页 → 问答吧 → delphi会偷偷转换数据类型吗?

delphi会偷偷转换数据类型吗?

时间:2011-09-30

来源:互联网

Delphi(Pascal) code

function Decrypt(const S: String): String;
var
  I: byte;
  Key: Word;
begin
  Key := Keyword;
  SetLength(Result,Length(S));
  for I := 1 to Length(S) do
  begin
    Result[I] := char(byte(S[I]) xor (Key shr 8));
    Key := (byte(S[I]) + Key) * 21469+ 12347;
  end;
end;



已知(byte(S[I]) + Key) * 21469+ 12347的计算结果为:570636898

但Key的数据类型为word

输出Key 的时候结果不是570636898呢?输出的时候key 是一个比570636898小很多的值,没有超过65535的上限

作者: tg01   发布时间: 2011-09-30

Delphi(Pascal) code
messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347))



570636898

作者: tg01   发布时间: 2011-09-30

你变量Key定义为Word,而Word类型的数据范围是0-65535。你给Key那么大一个值不就超出它的范围了!你可以把Key定义成Integer或其它在范围内的数据类型。

作者: jayqiang   发布时间: 2011-09-30

引用 2 楼 jayqiang 的回复:

你变量Key定义为Word,而Word类型的数据范围是0-65535。你给Key那么大一个值不就超出它的范围了!你可以把Key定义成Integer或其它在范围内的数据类型。


我现在的问题就是给
Key := (byte(S[I]) + Key) * 21469+ 12347; 
这一句它不会出错
并且我messagebox输出Key 和(byte(S[I]) + Key) * 21469+ 12347的值不一样!

作者: tg01   发布时间: 2011-09-30

2楼说得不错
不要把
  Key: Word

改成
  Key: Integer

作者: ADSLAN   发布时间: 2011-09-30

引用 4 楼 adslan 的回复:

2楼说得不错
不要把
Key: Word

改成
Key: Integer

Delphi(Pascal) code

Key := (byte(S[I) + Key) * 21469+ 12347;]

大哥这代码不是我写的,而是正常运行的程序里面取出来的!
Delphi(Pascal) code
messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347))
弹出来是570636898
Delphi(Pascal) code
messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347))
弹出来是40000多的值

等式两边不一样,谁能告诉我为什么?

作者: tg01   发布时间: 2011-09-30

引用 5 楼 tg01 的回复:
引用 4 楼 adslan 的回复:

2楼说得不错
不要把
Key: Word

改成
Key: Integer


Delphi(Pascal) code


Key := (byte(S[I) + Key) * 21469+ 12347;]

大哥这代码不是我写的,而是正常运行的程序里面取出来的!

Delphi(Pascal) code

messag……




一个是 word值, word值是不会超过 65535的
你一个 word值 65535 你再+1 就变成0了


下面那个是 从 integer 转成 str的, 所以他不受 限制.

作者: warrially   发布时间: 2011-09-30

引用 6 楼 warrially 的回复:

引用 5 楼 tg01 的回复:
引用 4 楼 adslan 的回复:

2楼说得不错
不要把
Key: Word

改成
Key: Integer


Delphi(Pascal) code


Key := (byte(S[I) + Key) * 21469+ 12347;]

大哥这代码不是我写的,而是正常运行的程序里面取出来的!

Delphi(Pas……

您好,请问可以解释的细一些吗?
我不是学Delphi的

我用的是.net正在翻译这个函数

按照您的意思就是说40000是570636898除以N得出来的余数是吗?

作者: tg01   发布时间: 2011-09-30

Key := (byte(S[I) + Key) * 21469+ 12347;]

原作者的情况有以下两种:
1.这句的意思是KEY值等于后面结果取低8位,相当于KEY=word(*);
2.错误的估计了值的范围,本来需要integer的用了word

作者: cglzyz   发布时间: 2011-09-30