【发布时间】: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
除了在第一行将 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
.. 除了将 0 从 int 提升为 double ..
好吧,标准并没有为此使用“促销”一词。该标准使用术语“常用算术转换”。
标准中的术语“promotion”与“integer Promotion”相关,并说明在应用所用运算符之前如何将不同的整数类型转换为常见的整数类型..
顺便说一句:使unsigned int 指针指向double 对象并取消引用它,违反了严格的别名规则。
根据 Ian Abbott 的评论进行编辑:
术语“提升”也用于“默认参数提升”,包括将函数的变量参数或没有原型的函数的参数提升为浮点数。
【讨论】:
float 提升到double,用于函数的可变参数或没有原型的函数。
除了在第一行将 0 从 int 提升到 double 之外,还有其他提升吗?
没有。
1. 或 1.0 是 double 类型的常量。 - 不会改变操作数的类型,因为它不是小整数类型,而是 double。0 的类型为 int,并在常规算术转换中提升为 double。/ 的结果类型为double。这与变量d 的类型相同,因此不会发生左值转换。详情请看:Implicit type promotion rules
与您的问题无关,将 double d 取消引用为整数类型会调用未定义的行为错误:它违反了严格的别名规则。在指向类型的末尾进行指针运算也是未定义的行为。
【讨论】: