2011-02-17 62 views
3

昨天採訪時面試官問了我一個問題:爲什麼下面的代碼沒有給出想要的答案?

爲什麼下面的代碼不能給出想要的答案?

int a = 100000, b = 100000; 

long int c = a * b ; 

的語言是C.

我已經告訴我們先算100000 * 100000一個int(溢)就在這時,將它轉換爲長面試官。

+1

我不知道你使用了哪種語言,但是我用c#試過了,它能正常工作。你標記了c#,C++和c。請更具體地 – Christian 2011-02-17 12:32:15

+0

現在的問題是,沒有說什麼所期望的答案聽起來像我們每天在SO上看到的一些「它不起作用」的問題,並且必須單調乏味地爲牛奶提供細節。它似乎產生了答案*我*的願望。 @Christian:你確定嗎?我的C#編譯器拒絕編譯此代碼。 – 2011-02-17 12:32:33

+2

我在Visual C++ 9中試過它,結果是100M,就像我期望的那樣。怎麼了? – sharptooth 2011-02-17 12:33:02

回答

5

我猜測線索會發生,但是如此低的值,我不會看到發生。

最大的INT(通常是32位)(正)值是:2,147,483,647

你的計算結果爲:

UPDATE:

,並提供更新的問題:100000 * 100000而不是10000 * 10000結果10,000,000,000,其中導致overf低發生。然後這個值會被拋棄很長時間。

爲了防止這種溢出,正確的方法是將乘法中的兩個值中的一個值轉換爲長(通常爲64位)。例如。 (long)100000 * 100000

5

這是因爲它首先計算它作爲int,才把投射成一個長變量(因此第一溢出爲一個整數,然後變爲一個長) 代碼應該是

long int c = a*(long int)b; 
3

100000*1000001000000000010,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位。

相關問題