我正在閱讀http://www.cplusplus.com/doc/tutorial/typecasting/。它說:同類數字類型之間的轉換
-
否則,如果轉換爲數字類型同種 (整數到整數或浮點數到浮)之間的轉換是有效的, 但價值是特定於實現的(並且可能不是可移植的)。
但我真的不明白是什麼上述報價的意思是說?有人請用一個簡單的例子來解釋它嗎?爲什麼在相同類型的數字類型之間進行轉換會導致實現特定的值?是什麼原因?
我正在閱讀http://www.cplusplus.com/doc/tutorial/typecasting/。它說:同類數字類型之間的轉換
否則,如果轉換爲數字類型同種 (整數到整數或浮點數到浮)之間的轉換是有效的, 但價值是特定於實現的(並且可能不是可移植的)。
但我真的不明白是什麼上述報價的意思是說?有人請用一個簡單的例子來解釋它嗎?爲什麼在相同類型的數字類型之間進行轉換會導致實現特定的值?是什麼原因?
讓我們看看下面的例子:
long long int lli = 5000000000;
long int li;
int i;
li = lli;
i = li;
你能預測的lli
,li
和i
值是多少?或者li
和i
是否具有相同的值?
答案是 - 值取決於爲每種類型分配的字節數! 也就是說對於某些情況,int
等於long int
,對於其他long int
等於long long int
,但一般情況下long
er類型可以更長。對於float
,double
和long double
類似(以存儲器大小的意義)。
該片段分別指縮小整數和浮點類型之間的轉換。也就是說,它表示雖然整型或浮點型之間的轉換是有效的,但結果值將被實現定義。
作爲一個例子考慮下面的代碼段:
#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 double
和double
之間的轉換也是如此。
那麼,在C++的一些實現中long可能不會大於int?你知道這樣的實現嗎? – Destructor
@PravasiMeet實際上這是常見的情況。如果我沒有弄錯,Visual Studio x86和x64以及gcc x86都有sizeof(long)== sizeof(int),如果clang也這樣做,我不會感到驚訝。 – Pixelchemist
@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