Понимание неявных преобразований для printf

Стандарт C99 различает неявные и явные преобразования типов (6.3 преобразования). Я предполагаю, но не смог найти, что неявное приведение выполняется, когда целевой тип имеет большую точность, чем исходный, и может представлять его значение. [Это то, что я считаю происходящим от INT до DOUBLE]. Учитывая это, я смотрю на следующий пример:

#include <stdio.h>  // printf
#include <limits.h> // for INT_MIN
#include <stdint.h> // for endianess
#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)

int main()
{
  printf("sizeof(int): %lu\n", sizeof(int));
  printf("sizeof(float): %lu\n", sizeof(float));
  printf("sizeof(double): %lu\n", sizeof(double));
  printf( IS_BIG_ENDIAN == 1 ? "Big" : "Little" ); printf( " Endian\n" );

  int a = INT_MIN;
  printf("INT_MIN: %i\n", a);
  printf("INT_MIN as double (or float?): %e\n", a);
}

Я был очень удивлен, обнаружив, что результат:

sizeof(int): 4
sizeof(float): 4
sizeof(double): 8
Little Endian
INT_MIN: -2147483648
INT_MIN as double (or float?): 6.916919e-323

Таким образом, напечатанное значение с плавающей запятой представляет собой субнормальное число с плавающей запятой вблизи минимального субнормального положительного двойного числа 4,9406564584124654 × 10 ^ −324. Странные вещи случаются, когда я закомментирую два printf для endianess, я получаю другое значение для double:

#include <stdio.h>  // printf
#include <limits.h> // for INT_MIN
#include <stdint.h> // for endianess
#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)

int main()
{
  printf("sizeof(int): %lu\n", sizeof(int));
  printf("sizeof(float): %lu\n", sizeof(float));
  printf("sizeof(double): %lu\n", sizeof(double));
  // printf( IS_BIG_ENDIAN == 1 ? "Big" : "Little" ); printf( " Endian\n" );

  int a = INT_MIN;
  printf("INT_MIN: %i\n", a);
  printf("INT_MIN as double (or float?): %e\n", a);
}

выход:

sizeof(int): 4
sizeof(float): 4
sizeof(double): 8
INT_MIN: -2147483648
INT_MIN as double (or float?): 4.940656e-324
gcc --version: (Ubuntu 4.8.2-19ubuntu1) 4.8.2uname: x86_64 GNU / Linuxпараметры компилятора, где: gcc -o x x.c -Wall -Wextra -std = c99 --pedanticИ да там, где одно предупреждение:
x.c: In function ‘main’:
x.c:15:3: warning: format ‘%e’ expects argument of type ‘double’, but argument 2
          has type ‘int’ [-Wformat=]

   printf("INT_MIN as double (or float?): %e\n", a);
   ^

Но я до сих пор не могу понять, что именно происходит.

с небольшим порядком байтов я рассматриваю MIN_INT как: 00 ... 0001 и MIN_DBL (Subnormal) как 100..00 #, начиная с мантиссы, затем показателя степени и заканчивая#&nbsp;как знак бит.Является ли эта форма применения спецификатора формата "% e" к типу int неявным приведением?

Я потерян, пожалуйста, просветите меня.