I am learning C and wrote the following code:

```
#include <stdio.h>

int main()
{
    double a = 2.5;
    say(a);
}

void say(int num)
{
    printf("%u\n", num);
}

```

When I compile this program, the compiler gives following warnings:

```
test.c: In function ‘main’:
test.c:6:2: warning: implicit declaration of function ‘say’ [-Wimplicit-function-declaration]
    6 |  say(a);
      |  ^~~
test.c: At top level:
test.c:9:6: warning: conflicting types for ‘say’
    9 | void say(int num)
      |      ^~~
test.c:6:2: note: previous implicit declaration of ‘say’ was here
    6 |  say(a);
      |  ^~~

```

Running the program unexpectedly leads to a 1 being printed. From my limited understanding, because I did not add a function prototype for the compiler, the compiler implicitly creates one from the function call on line 6, expecting a double as a parameter and warns me about this implicit declaration. But later I define the function with a parameter of type int. The compiler gives me two warnings about the type mismatch.

I expect argument coercion, meaning the double will be converted to an integer. But in that case, the output should be 2, and not a 1. What exactly is going on here?