Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同类数字类型之间的转换_C++_Type Conversion_Implicit Conversion_Primitive Types - Fatal编程技术网

C++ 同类数字类型之间的转换

C++ 同类数字类型之间的转换,c++,type-conversion,implicit-conversion,primitive-types,C++,Type Conversion,Implicit Conversion,Primitive Types,我在看书。它说: 否则,如果在相同类型的数字类型之间进行转换 (整数到整数或浮点到浮点),转换有效, 但该值是特定于实现的(并且可能不可移植) 但我真的不明白上面的话是什么意思?有人能用一个简单的例子解释一下吗?为什么相同类型的数字类型之间的转换会产生特定于实现的值?原因是什么? 让我们考虑下面的例子: long-long-int-lli=5000000000; 龙英利; int i; li=lli; i=li; 你能预测lli、li和i的值吗?或者li和i是否具有相同的值 答案是-值

我在看书。它说:

  • 否则,如果在相同类型的数字类型之间进行转换 (整数到整数或浮点到浮点),转换有效, 但该值是特定于实现的(并且可能不可移植)


但我真的不明白上面的话是什么意思?有人能用一个简单的例子解释一下吗?为什么相同类型的数字类型之间的转换会产生特定于实现的值?原因是什么?

让我们考虑下面的例子:

long-long-int-lli=5000000000;
龙英利;
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;
}

正如您所看到的,
long
integer的最大值超过了普通整数的容量。但是,您可以将
long
转换为
int
(即,转换有效),但由于
int
无法保持
long
的最大值,因此无法进行准确的转换。因此,结果
int
的值由实现决定。对于<代码>长双倍/代码>和 >

,那么,在某些C++实现中,long是否不大于int是可能的?你知道这样的实现吗?@PravasiMeet事实上这是常见的情况。如果我没有弄错的话,Visual Studio x86和x64以及gcc x86的sizeof(long)=sizeof(int),如果clang也这样做,我也不会感到惊讶。@Pixelchemist:是的,gcc 5.2.0和clang 3.5.0也这样做。见现场演示&。我三次得到5000000000作为输出。但当我在上面运行它时,它会给我5000000000705032704 705032704作为输出。我希望原始答案的作者在他的答案中添加这些链接。
7fffffffffffffff
ffffffff
1.18973e+4932
inf