Ответ 1
Проблема заключается в расхождении между тем, что считает компилятор (как показано в sizeof
: sizeof(unsigned long long int)
, оценивается во время компиляции) и то, что верит библиотеке времени выполнения (как показано в printf
: printf
функция вызывается во время выполнения, поэтому, когда ее спецификаторы формата вступают в силу).
В соответствии с "C99" в документации MinGW:
GCC не включает библиотеку времени выполнения C. Это обеспечивается платформой. Порт MinGW GCC использует оригинальную (старую) среду Visual C, MSVCRT, которая была нацелена на Microsoft Visual Studio 6 (выпущена в 1998 году).
[& hellip;]
Поскольку MinGW полагается на MSVCRT, у него есть те же ограничения и причуды с совместимостью, что и Visual Studio 6. Вы должны предположить, что приложения MinGW не могут полагаться на поведение C99, только на C89. Например, новые символы формата в printf, такие как% a и% ll, не поддерживаются, хотя существует метод для% ll.
(Обходной путь, который он упоминает, заключается в использовании I64
вместо ll
: so, %I64X
. Досадно, по крайней мере, в моей системе GCC выдаст предупреждение, когда увидит, что в литеральной форматированной строке, потому что он предполагает, что у него будет лучшая библиотека времени выполнения.)