昨天採訪時面試官問了我一個問題:爲什麼下面的代碼沒有給出想要的答案?
爲什麼下面的代碼不能給出想要的答案?
int a = 100000, b = 100000;
long int c = a * b ;
的語言是C.
我已經告訴我們先算100000 * 100000一個int(溢)就在這時,將它轉換爲長面試官。
昨天採訪時面試官問了我一個問題:爲什麼下面的代碼沒有給出想要的答案?
爲什麼下面的代碼不能給出想要的答案?
int a = 100000, b = 100000;
long int c = a * b ;
的語言是C.
我已經告訴我們先算100000 * 100000一個int(溢)就在這時,將它轉換爲長面試官。
我猜測線索會發生,但是如此低的值,我不會看到發生。
最大的INT(通常是32位)(正)值是:2,147,483,647
你的計算結果爲:億
UPDATE:
,並提供更新的問題:100000 * 100000
而不是10000 * 10000
結果10,000,000,000,其中將導致overf低發生。然後這個值會被拋棄很長時間。
爲了防止這種溢出,正確的方法是將乘法中的兩個值中的一個值轉換爲長(通常爲64位)。例如。 (long)100000 * 100000
這是因爲它首先計算它作爲int,才把投射成一個長變量(因此第一溢出爲一個整數,然後變爲一個長) 代碼應該是
long int c = a*(long int)b;
100000*100000
是10000000000
(10,000,000,000
)比32位int
可以表示的最大值(2,147,483,647
)更大,從而它overflows。
a*b
仍然是一個int
,它不是一個long int
,因爲表達a*b
成員均爲int
類型的,因此它們沒有被轉換成long int
:這種轉換僅將a*b
後發生已經被評估,當結果被分配c
。如果你想的a*b
的結果是long int
你需要操作數的至少一種轉化爲long int
:
long int c = (long int)a * (long int)b.
而且long int
可能是int
相同的大小(它可以在32位表示太) :這最有可能發生在32位應用程序中,通常是sizeof(int) == sizeof(long int) == 4
。
如果你需要c
爲64位,你應該使用像int64_t
這樣的變量,它可以確保你的位數是64位。
我不知道你使用了哪種語言,但是我用c#試過了,它能正常工作。你標記了c#,C++和c。請更具體地 – Christian 2011-02-17 12:32:15
現在的問題是,沒有說什麼所期望的答案聽起來像我們每天在SO上看到的一些「它不起作用」的問題,並且必須單調乏味地爲牛奶提供細節。它似乎產生了答案*我*的願望。 @Christian:你確定嗎?我的C#編譯器拒絕編譯此代碼。 – 2011-02-17 12:32:33
我在Visual C++ 9中試過它,結果是100M,就像我期望的那樣。怎麼了? – sharptooth 2011-02-17 12:33:02