Если вы выразите результат в шестнадцатеричном (% x), вы увидите, что:
858927408 = 0x33323130
0x33
является кодом ASCII для '3'
0x32
- это код ASCII для '2'
0x31
- это код ASCII для '1'
0x30
- это код ASCII для '0'
Таким образом, вы просто отображаете память, хранящую 0123456...
Но так как ваш процессор little endian , вы видите инвертированные коды.
В памяти у вас есть (в гекса)
30 31 32 33 34 35 36 37 38 # 0 1 2 3 4 5 6 7 8
39 30 31 32 33 34 35 36 37 # 9 0 1 2 3 4 5 6 7
38 39 00 # 8 9\0
В printf("%d...")
вы читаете 4 первых байта как маленькое целое число с прямым порядком байтов, поэтому он отображает результат 0x33*0x1000000 + 0x32*0x10000 +0x31*0x100 +0x30
С %c
все по-другому:
Если вы напишите printf("%c", pp[0])
, вы попытаетесь напечатать ОДИН символ из 0x33323130
, поэтому 0x30
сохраняется (в вашем случае это может быть UB в некоторых случаях, я не уверен), поэтому он отображает «0», код ascii 0x30
Если вы напишите printf("%c", pp[1])
, вы попытаетесь напечатать ОДИН символ из 0x37363534
, поэтому значение 0x34
будет сохранено, и на нем отобразится «4», код ascii равен 0x34