学习c语言宏定义遇到的问题

在学习c语言时遇到以下问题;

为什么下面代码中最终的输出结果为0.000000?

#include <stdio.h>
//#define PT 5.5
//#define S(x) PT*x*x
int main() {
    int a = 1, b = 2;
//    printf("%f\n", S(a + b));
//    printf("%f\n", S(3));
//    printf("%f\n", S(2));
//    printf("%f\n", S(1));
    printf("%f\n", a + b );
    return 0;
}

代码基本不变但是把注释取消了
这时为什么最后一条的输出又变成了5.500000?
并且发现改动a、b的值其结果不变,反而随宏定义中PT变化而变化

#include <stdio.h>
#define PT 5.5
#define S(x) PT*x*x
int main() {
    int a = 1, b = 2;
    printf("%f\n", S(a + b));
    printf("%f\n", S(3));
    printf("%f\n", S(2));
    printf("%f\n", S(1));
    printf("%f\n", a + b );
    return 0;
}

输出结果:

9.500000
49.500000
22.000000
5.500000
5.500000

float内存中保存的方式跟int不一样。float内存中按IEEE的规范保存。

img