線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2057
推到 Plurk!
推到 Facebook!

EIntOverFlow 的問題

答題得分者是:jow
shrwei
一般會員


發表:3
回覆:2
積分:1
註冊:2006-07-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-05 16:17:16 IP:218.211.xxx.xxx 訂閱
這問題因該滿基本的,不過我不太了解中間的運作過程(我使用的是Delphi 6) 
想請教一下,為何使用 Floor 再用shr 會引發 EIntOverFlow 的問題?
~.~妖受以前的前輩教我用shr 來代替 div ..現在看起來問題很多~@@"

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
i:= -7 shr 1; //i值正常
i:= Floor(-7) div 2; //i值正常
i:= Floor(-7) shr 1; //i值異常
i:= Floor((100-107) * (10/10)) shr 1;
i:= 400 i;
end;

[/code]


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
a,b: integer;
begin
a:= 100;
b:= 112;
i := ((a - b) shr 1); //i值異常

i:= ((100 - 112) shr 1); //i值正常
end;

[/code]
編輯記錄
shrwei 重新編輯於 2007-10-05 16:18:23, 註解 無‧
shrwei 重新編輯於 2007-10-05 16:26:43, 註解 無‧
shrwei 重新編輯於 2007-10-05 16:34:45, 註解 無‧
shrwei 重新編輯於 2007-10-05 16:36:41, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-05 17:04:37 IP:210.66.xxx.xxx 訂閱
與Floor()無關,  可是為什麼Delphi shr 的動作,在負值時對於'常數' 與 ' 變數' 處理不一樣???


[code delphi]
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
I := -2;
Label1.Caption := Format('%X', [I]);

I := -2 shr 1;
Label2.Caption := Format('%X', [I]);

I := -2;
I := I shr 1;
Label3.Caption := Format('%X', [I]);

//結果顯示
//Label1.Caption = 'FFFFFFFE';
//Label2.Caption = 'FFFFFFFF';
//Label3.Caption = '7FFFFFFF';
end;
[/code]
編輯記錄
jow 重新編輯於 2007-10-05 17:06:13, 註解 無‧
shrwei
一般會員


發表:3
回覆:2
積分:1
註冊:2006-07-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-05 17:23:56 IP:218.211.xxx.xxx 訂閱
嗯~我剛又試了一下~~因該 jow 大大的結論比較對~ ~
不過負數在常數和變數的運作運作的結果不同..有人可以找出原因嗎~~
怪異的delphi 運作~~
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-05 18:20:29 IP:123.193.xxx.xxx 訂閱
在System.pas中, 自己看^^

不知道那些 built into the compiler 的東西,
有沒有用到這些程式碼?

// ------------------------------------------------------------------------------
// 64-bit signed shift right
// ------------------------------------------------------------------------------
// target (EAX:EDX) count (ECX)

procedure __llshr;


// ------------------------------------------------------------------------------
// 64-bit unsigned shift right
// ------------------------------------------------------------------------------
// target (EAX:EDX) count (ECX)

procedure __llushr;
編輯記錄
jow 重新編輯於 2007-10-05 18:27:15, 註解 無‧
系統時間:2024-11-23 16:15:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!