C++數值相加溢位問題 |
尚未結案
|
seabird
一般會員 發表:5 回覆:3 積分:1 註冊:2004-04-07 發送簡訊給我 |
我寫了一個程式,大約問題如下 __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 發送簡訊給我 |
|
seabird
一般會員 發表:5 回覆:3 積分:1 註冊:2004-04-07 發送簡訊給我 |
上面的大大很感謝你的回答,不過....
抱歉!!我忘了說!!
我有將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 發送簡訊給我 |
|
seabird
一般會員 發表:5 回覆:3 積分:1 註冊:2004-04-07 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
引言: 依照我對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在您的例子裡,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 的運作。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |