【问题标题】:Conversion between numeric types of the same kind同类数值类型之间的转换
【发布时间】:2021-08-12 13:31:09
【问题描述】:

我正在阅读http://www.cplusplus.com/doc/tutorial/typecasting/。它说:

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

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

【问题讨论】:

    标签: c++ type-conversion implicit-conversion primitive-types


    【解决方案1】:

    让我们考虑以下示例:

        long long int lli = 5000000000;
        long int li;
        int i;
        li = lli;
        i = li;
    

    你能预测llilii的值吗?或者lii的值是否相同?

    答案是 - 值取决于为每种类型分配的字节数! IE。对于某些情况int 等于long int,对于其他情况long int 等于long long int,但通常longer 类型可以更长。 floatdoublelong double 类似(就内存大小而言)。

    【讨论】:

    • 那么,在某些 C++ 实现中,long 是否可能不大于 int?你知道这样的实现吗?
    • @PravasiMeet 这实际上是常见的情况。如果我没记错的话,Visual Studio x86 和 x64 以及 gcc x86 有 sizeof(long) == sizeof(int),如果 clang 也这样做,我不会感到惊讶。
    • @Pixelchemist:是的 gcc 5.2.0 和 clang 3.5.0 也是如此。查看现场演示 melpon.org/wandbox/permlink/IsGDktKO5VUBY0KVmelpon.org/wandbox/permlink/6icDnbxu4hAIkwMN。我得到了 5000000000 作为输出 3 次。但是当我在webcompiler.cloudapp.net 上运行它时,它会给我 5000000000 705032704 705032704 作为输出。我希望原始答案作者将这些链接添加到他的答案中。
    【解决方案2】:

    sn-p 指的是分别缩小整数和浮点类型之间的转换。也就是说,它声明虽然整数类型之间或浮点类型之间的转换是有效的,但结果值将由实现定义。

    例如,考虑以下代码:

    #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 之间的转换也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2019-05-01
      相关资源
      最近更新 更多