Implizite Konvertierungen für printf verstehen

Der C99-Standard unterscheidet zwischen impliziten und expliziten Typkonvertierungen (6.3 Konvertierungen). Ich vermute, konnte aber nicht feststellen, dass implizite Casts ausgeführt werden, wenn der Zieltyp eine höhere Genauigkeit als die Quelle aufweist und deren Wert darstellen kann. [Das ist, was ich denke, von INT zu DOUBLE passieren]. Dazu schaue ich mir folgendes Beispiel an:

#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);
}

ch war sehr überrascht, diese Ausgabe zu finden:

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

So ist der gedruckte Gleitkommawert eine subnormale Gleitkommazahl in der Nähe des minimalen subnormalen positiven Doppelwerts 4.9406564584124654 × 10 ^ −324. Seltsame Dinge passieren, wenn ich die beiden printf für endianess auskommentiere, ich bekomme einen anderen Wert für das 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);
}

Ausgabe

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 Compiler-Optionen, wobei: gcc -o x x.c -Wall -Wextra -std = c99 --pedanticUnd da ist ja wo eine Warnung:
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);
   ^

Aber ich kann immer noch nicht verstehen, was genau passiert.

in little endianess Ich betrachte MIN_INT als: 00 ... 0001 und MIN_DBL (Subnormal) als 100..00 #, beginnend mit der Mantisse, gefolgt vom Exponenten und schließe mit dem# als Vorzeichenbit.Ist diese Form der Anwendung des "% e" -Formatspezifizierers auf ein int, eine implizite Umwandlung ?, eine Neuinterpretation der Umwandlung?

Ich bin verloren, bitte erleuchten Sie mich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage