Semplicemente con
d stai indicando alla funzione printf che si tratta di un int, con
ld di un long int.
l è lo specificatore di lunghezza.
Nel caso in cui una variabile di tipo
long int dovesse contenere un valore maggiore o minore dei limiti di
int (perfettamente lecito) quando printf viene invocata con lo specificatore di conversione
d si aspetta valori nei limiti di int, ma nel nostro caso long int contiene un valore maggiore/minore dei limiti di int quindi si verifica un
undefined behaviour. Lo C standard dice:
If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
Fonte:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf Capitolo
7.19.6 Formatted input/output functions punto 9
E' buona norma usare lo specificatore uguale al tipo di dato da stampare:
http://www.cplusplus.com/reference/cstdio/printf/