[0]
Format Specifier %d
The format specifier %d takes integer value as a signed decimal integer value
which means values should be decimal whether it is negative or positive.
Format Specifier %i
The format specifier %i takes integer value as an integer value which means
values should be decimal, octal and hexadecimal and octal value is provided by
preceding ‘0’ while hexadecimal value is provided by preceding ‘0x’.
[1]
They are the same when used for output, e.g. with printf.
However, these are different when used as input specifier e.g. with scanf,
where %d scans an integer as a signed decimal number, but %i defaults to
decimal but also allows hexadecimal (if preceded by 0x) and octal (if preceded
by 0).
So 033 would be 27 with %i but 33 with %d.
[2]
These are identical for printf but different for scanf. For printf, both %d
and %i designate a signed decimal integer. For scanf, %d and %i also means a
signed integer but %i inteprets the input as a hexadecimal number if preceded
by 0x and octal if preceded by 0 and otherwise interprets the input as
decimal.