2015-12-21 18 views
5

我正在閱讀http://www.cplusplus.com/doc/tutorial/typecasting/。它說:同類數字類型之間的轉換

  • 否則,如果轉換爲數字類型同種 (整數到整數或浮點數到浮)之間的轉換是有效的, 但價值是特定於實現的(並且可能不是可移植的)。

但我真的不明白是什麼上述報價的意思是說?有人請用一個簡單的例子來解釋它嗎?爲什麼在相同類型的數字類型之間進行轉換會導致實現特定的值?是什麼原因?

回答

5

讓我們看看下面的例子:

long long int lli = 5000000000; 
    long int li; 
    int i; 
    li = lli; 
    i = li; 

你能預測的llilii值是多少?或者lii是否具有相同的值?

答案是 - 值取決於爲每種類型分配的字節數! 也就是說對於某些情況,int等於long int,對於其他long int等於long long int,但一般情況下long er類型可以更長。對於float,doublelong double類似(以存儲器大小的意義)。

+0

那麼,在C++的一些實現中long可能不會大於int?你知道這樣的實現嗎? – Destructor

+2

@PravasiMeet實際上這是常見的情況。如果我沒有弄錯,Visual Studio x86和x64以及gcc x86都有sizeof(long)== sizeof(int),如果clang也這樣做,我不會感到驚訝。 – Pixelchemist

+0

@Pixelchemist:是的gcc 5.2.0和鏗鏘3.5.0也一樣。觀看現場演示http://melpon.org/wandbox/permlink/IsGDktKO5VUBY0KV&http://melpon.org/wandbox/permlink/6icDnbxu4hAIkwMN。我獲得了50億的輸出3次。但是當我在http://webcompiler.cloudapp.net/上運行它時,它會以5000000000 705032704 705032704作爲輸出。我希望最初的答案編寫者將這些鏈接添加到他的答案中。 – Destructor

1

該片段分別指縮小整數和浮點類型之間的轉換。也就是說,它表示雖然整型或浮點型之間的轉換是有效的,但結果值將被實現定義。

作爲一個例子考慮下面的代碼段:

#include <iostream> 
#include <limits> 

int main() { 
    long long lgm = std::numeric_limits<long long>::max(); 
    std::cout << std::hex << lgm << std::endl; 
    int i = lgm; 
    std::cout << std::hex << i << std::endl; 

    long double ldb = std::numeric_limits<long double>::max(); 
    std::cout << std::hex << ldb << std::endl; 
    double db = ldb; 
    std::cout << std::hex << db << std::endl; 
} 

輸出:

7fffffffffffffff 
ffffffff 
1.18973e+4932 
inf 

正如你可以看到long long整數的最大值超過一個普通整數的容量。但是,您可以將long long轉換爲int(即轉換有效),但由於int無法保留long long的最大值,因此無法進行準確的轉換。因此,產生的int的價值由實施決定。 long doubledouble之間的轉換也是如此。

相關問題