同类数值类型之间的转换
Conversion between numeric types of the same kind
我正在阅读 http://www.cplusplus.com/doc/tutorial/typecasting/。它说:
Otherwise, if the conversion is between numeric types of the same kind
(integer-to-integer or floating-to-floating), the conversion is valid,
but the value is implementation-specific (and may not be portable).
但是我真的不明白上面那句话是什么意思?有人可以用一个简单的例子来解释吗?为什么同类数字类型之间的转换会产生特定于实现的值?这是什么原因?
让我们考虑以下示例:
long long int lli = 5000000000;
long int li;
int i;
li = lli;
i = li;
你能预测 lli
、li
和 i
的值吗?或者 li
和 i
是否具有相同的值?
答案是 - 值取决于为每种类型分配的字节数!
IE。对于某些情况 int
等于 long int
,对于其他情况 long int
等于 long long int
,但通常 long
类型可以更长。 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
无法保存 [=12 的最大值=] 无法准确转换。因此,结果 int
的值由实现决定。 long double
和double
之间的转换也是如此。
我正在阅读 http://www.cplusplus.com/doc/tutorial/typecasting/。它说:
Otherwise, if the conversion is between numeric types of the same kind (integer-to-integer or floating-to-floating), the conversion is valid, but the value is implementation-specific (and may not be portable).
但是我真的不明白上面那句话是什么意思?有人可以用一个简单的例子来解释吗?为什么同类数字类型之间的转换会产生特定于实现的值?这是什么原因?
让我们考虑以下示例:
long long int lli = 5000000000;
long int li;
int i;
li = lli;
i = li;
你能预测 lli
、li
和 i
的值吗?或者 li
和 i
是否具有相同的值?
答案是 - 值取决于为每种类型分配的字节数!
IE。对于某些情况 int
等于 long int
,对于其他情况 long int
等于 long long int
,但通常 long
类型可以更长。 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
无法保存 [=12 的最大值=] 无法准确转换。因此,结果 int
的值由实现决定。 long double
和double
之间的转换也是如此。