我正在阅读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