全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1409
推到 Plurk!
推到 Facebook!

C++數值相加溢位問題

尚未結案
seabird
一般會員


發表:5
回覆:3
積分:1
註冊:2004-04-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-27 09:25:15 IP:211.22.xxx.xxx 未訂閱
我寫了一個程式,大約問題如下 __int64 i64_val; int i_val_1, i_val_2, i_val_3; 若i_val_1, i_val_2, i_val_3數值皆已接近INT_MAX的值 我採用下列敘述,將會產生i64_val溢位 i64_val = i_val_1 i_val_2 i_val_3; 此敘述溢位似乎合乎C 標準 我採用下列敘述,將不會產生i64_val溢位 i64_val = i_val_1; i64_val = i_val_2; i64_val = i_val_3; 此敘述不會溢位似乎也合乎C 標準 我採用下列敘述,將產生i64_val溢位 i64_val = i_val_1 i_val_2 i_val_3; 但此敘述會造成i64_val溢位我真的不知道什麼原因,可以請哪位厲害的大大告訴我答案嗎?我用的是BCB 5.0
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-27 10:16:28 IP:61.62.xxx.xxx 未訂閱
i64_val = i_val_1 i_val_2 i_val_3; 會造成i64_val溢位原因.有可能為. 宣告i64_val後.沒有指定數值.所以i64_val不為0 所以當你運行i64_val = i_val_1 i_val_2 i_val_3; 其實是 i64_val = i64_val i_val1_1 i_val_2 i_val_3; 試著用__int64 i64_val =0; 希望對你有幫助
seabird
一般會員


發表:5
回覆:3
積分:1
註冊:2004-04-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-27 13:24:05 IP:211.22.xxx.xxx 未訂閱
上面的大大很感謝你的回答,不過.... 抱歉!!我忘了說!! 我有將i64_val給初始值,.......只是我省略沒寫!! 依照我對C 的了解是當兩數相加時 編譯器會進行整數升級的動作 也就是說int與int相加時會自動將int升級為long 兩值相加後的結果,在轉變成為int後傳給相對應的變數 而int與比int大型態相加時會自動將int升級為其對應型態 也就是說int與__int64相加時會自動將int升級為_int64後再與另一__int64相加 相加後結果會成為__int64型態,再傳給__int64的對應變數 依照上述理論應該不至於有溢位情形產生 因為 i64_val = i_val_1 i_val_2 i_val_3; i_val_1, i_val_2, i_val_3三變數應該會做整數升級的動作 應該不至於溢位才是,不知哪位大大能給我一個解答告訴我為什麼ㄋ??
stanley
一般會員


發表:9
回覆:36
積分:14
註冊:2003-11-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-27 14:09:59 IP:61.219.xxx.xxx 未訂閱
建議你將i_val_1, i_val_2, i_val_3三個變數改成unsigned int試試看
seabird
一般會員


發表:5
回覆:3
積分:1
註冊:2004-04-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-27 14:20:15 IP:211.22.xxx.xxx 未訂閱
不好意思ㄟ!! 我的數值可能有負值 且主要的問題我是想知道為什麼編譯器再編譯時 相同的語義會有不同的結果??? 不過還是感謝大大的相助
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-28 09:08:09 IP:211.23.xxx.xxx 未訂閱
引言: 依照我對C 的了解是當兩數相加時 編譯器會進行整數升級的動作 也就是說int與int相加時會自動將int升級為long 兩值相加後的結果,在轉變成為int後傳給相對應的變數
編譯器會進行整數升級的動作?! 標準c compiler不會做這種事。
引言: 而int與比int大型態相加時會自動將int升級為其對應型態 也就是說int與__int64相加時會自動將int升級為_int64後再與另一__int64相加 相加後結果會成為__int64型態,再傳給__int64的對應變數
您這部分的觀念大致上是對的。
引言: 依照上述理論應該不至於有溢位情形產生 因為 i64_val = i_val_1 i_val_2 i_val_3; i_val_1, i_val_2, i_val_3三變數應該會做整數升級的動作 應該不至於溢位才是,不知哪位大大能給我一個解答告訴我為什麼ㄋ??
i64_val = i_val_1 i_val_2 i_val_3; 在c 中是先做i_val_1 i_val_2 i_val_3, 然後再執行 =這個operator。 如果您曾經使用過class 的 overload operator 的話, 請注意不同型態的 =operator宣告是這樣的:
template ClassName1 operator =(ClassName2 uAdd);
在您的例子裡,ClassName是int64,ClassName2是int, 那麼執行 i64_val = i_val_1 i_val_2 i_val_3; 時, 1) 是先將i_val_1 i_val_2 i_val_3 的結果放到int 的 uAdd。(已經溢位!!) 2) 再將uAdd與i64_val相加,把結果丟給i64_val, 也就是i64_val = i64_val uAdd;
希望這樣說明, 能更讓您了解c 的運作。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
系統時間:2024-06-29 17:40:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!