2015-12-21 20 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之间的转换也是如此。

相关问题