隐式地抛出一个浮点常数

roo*_*kea 10 c floating-point casting

请看一下这段代码:

#include <stdio.h>

int main(void)
{
    short s;
    int i = 65696;
    float f = 65696.0F;

    printf("sizeof(short) = %lu\n", sizeof(short));

    s = i;
    printf("s = %hd\n", s);
    s = f;
    printf("s = %hd\n", s);

    s = 65696;
    printf("s = %hd\n", s);
    s = 65696.0F;
    printf("s = %hd\n", s);

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

sizeof(short) = 2
s = 160
s = 160
s = 160
s = 32767
Run Code Online (Sandbox Code Playgroud)

在最后一行为什么它是32767而不是160?说f = 65696.0F; s = f;和之间有什么区别s = 65696.0F;

oua*_*uah 13

因为如果浮点值的整数部分在新类型中不可表示,则转换是未定义的行为.

在你的情况下,SHRT_MAX可能是32767,因此65696.0Fshort对象中不能表示其组成部分.

  • +1.具体来说,6.3.1.4/1:*"当实数浮动类型的有限值转换为_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果积分的值part不能用整数类型表示,行为是未定义的)"* (7认同)
  • @rootkea这也是未定义的行为,是的未定义的行为可能是不可预测的. (3认同)
  • @rootkea它仍然是未定义的行为.它恰好在您的特定情况下返回"160". (2认同)