Проблема в том, что ваши типы не совпадают. Это неопределенное поведение.
Ваш второй аргумент b
не соответствует типу формата. Таким образом, происходит то, что printf()
читает за 4 байта, содержащие b (printf
ожидает 8-байтовый операнд, но b
- это только 4 байта). Поэтому вы получаете мусор. Третий аргумент вообще не печатается, так как ваш printf()
имеет только 2 кода формата.
Поскольку аргументы обычно передаются последовательно (и смежно) в памяти, 4 дополнительных байта, которые читает printf()
, на самом деле являются младшими 4 байтами c
.
Итак, в конце второе напечатанное число равно b + ((c & 0xffffffff) << 32)
.
Но я хочу повторить: это поведение не определено . Просто сегодня большинство систем ведут себя так.