【问题标题】:Understanding promotions (type conversions)了解促销(类型转换)
【发布时间】:2020-02-04 10:16:39
【问题描述】:

除了在第一行将 0 从 int 提升到 double 之外,还有其他提升吗?

double d=-1./0;   
unsigned int *pd = (unsigned int *)&d; 
printf("1:%08x\n",*++pd);   
printf("2:%08x",*--pd); 

【问题讨论】:

    标签: c type-conversion


    【解决方案1】:

    .. 除了将 0 从 int 提升为 double ..

    好吧,标准并没有为此使用“促销”一词。该标准使用术语“常用算术转换”。

    标准中的术语“promotion”与“integer Promotion”相关,并说明在应用所用运算符之前如何将不同的整数类型转换为常见的整数类型..

    顺便说一句:使unsigned int 指针指向double 对象并取消引用它,违反了严格的别名规则。

    根据 Ian Abbott 的评论进行编辑:

    术语“提升”也用于“默认参数提升”,包括将函数的变量参数或没有原型的函数的参数提升为浮点数。

    【讨论】:

    • 补充一点:术语“提升”也用于“默认参数提升”,其中包括将float 提升到double,用于函数的可变参数或没有原型的函数。
    • @IanAbbott 我已将您的评论编辑到答案中
    • Promotion 是“常用算术”的一部分,以及其他隐式转换规则。具体来说:“否则,对两个操作数都执行整数提升。”
    【解决方案2】:

    除了在第一行将 0 从 int 提升到 double 之外,还有其他提升吗?

    没有。

    • 1. 或 1.0 是 double 类型的常量。
    • 一元 - 不会改变操作数的类型,因为它不是小整数类型,而是 double。
    • 0 的类型为 int,并在常规算术转换中提升为 double。
    • / 的结果类型为double。这与变量d 的类型相同,因此不会发生左值转换。

    详情请看:Implicit type promotion rules


    与您的问题无关,将 double d 取消引用为整数类型会调用未定义的行为错误:它违反了严格的别名规则。在指向类型的末尾进行指针运算也是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2019-01-31
      • 1970-01-01
      • 2020-12-06
      • 2013-11-21
      • 2019-03-08
      • 1970-01-01
      相关资源
      最近更新 更多