位的问题(50分)

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
下面两个函数觉得写的没毛病,但结果就是不对
function MakeInt64(A,B:Integer):Int64;
begin
Result:=A or B shl 32;
end;

function HiInteger(L:Int64):Integer;
begin
Result := L shr 32;
end;

HiInteger(High(Int64))的值为:2147483647
Integer(High(Int64))的值为:-1
但MakeInt64(-1,2147483647)的值却为:-1
不知错在哪里
 
function MakeInt64(A,B:Integer):Int64;
begin
Result:=A or Int64(B) shl 32;
end;
 
仍然不行
 
type
_Int64 = record
loint: integer;
hiint: integer;
end;
function MakeInt64(A, B: Integer): Int64;
begin
_Int64(Result).loint := A;
_Int64(Result).hiint := B;
end;

function HiInteger(L: Int64): Integer;
begin
Result := _Int64(L).hiint;
end;

procedure TForm1.Button_TestClick(Sender: TObject);
var
_int:Int64;
begin
_int:= MakeInt64(1000, 20);
showmessage(inttostr(HiInteger(_int)));
end;
 
a=-1 INT ->FFFFFFFF
INT64 ->FFFFFFFFFFFFFFFF
你的MakeInt64函数,如果用OR操作的话,无论怎么SHL 得到的结果跟FFFFF...进行OR,结果肯定是FFF....FFFF=-1
为什么不直接使用加号呢?
 
function MakeInt64(A,B:Cardinal):Int64;
begin
Result:=A or Int64(B) shl 32;
end;

function HiCardinal(L:Int64):Cardinal;
begin
Result := L shr 32;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I:Int64;
J,K:Cardinal;
begin
I:=High(Int64);
J:=Int64Rec(I).Lo;
K:=Int64Rec(I).Hi;
mmo1.Lines.Add(IntToStr(I));
mmo1.Lines.Add(IntToStr(J));
mmo1.Lines.Add(IntToStr(K));
mmo1.Lines.Add(IntToStr(MakeInt64(J,K)));
mmo1.Lines.Add(IntToStr(Cardinal(I)));
mmo1.Lines.Add(IntToStr(HiCardinal(I)));
end;
 
function MakeInt64(A,B:Integer):Int64;
begin
Result:=int64(A) or int64(B) shl 32;
end;

function HiInteger(L:Int64):Integer;
begin
Result := L shr 32;
end;

function LoInteger(L:Int64):Integer;
begin
Result := L and $FFFF;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
Hi, Lo: integer;
begin
Hi:=HiInteger(High(Int64));//2147483647
Lo:=LoInteger(High(Int64));//65535
Edit1.Text:=inttostr(Hi);
Edit2.Text:=inttostr(Lo);
Edit3.Text:=inttostr(MakeInt64(Lo,Hi));//9223372032559874047
end;
 
楼主应该是高手了,3个多月前,我请教的那个路径算法,我一直没有再去看了,我没上QQ,能否把思路贴一贴?

说一下你的问题,我觉得你合并2个32位数可能有二义性,带符号数应该算是计算机的一个漏洞吧。
比如 100h 和 -1h 合并 是有2种结局的,不知道你需要哪种:
00000100 FFFFFFFF 和 000000FF FFFFFFFF。
 

Similar threads

后退
顶部