Что не так с printf ( "% llx" )?

У меня есть эта часть кода, которая бросает вызов всем моим знаниям C. Здесь у меня есть:

int main(void){
    unsigned long long int massage ;

    scanf("%llX", &massage); //input: 0x1234567890abcdef
    printf("%llX", massage);
    return 0;
}

На моем "64-битном - Corei5 - Fedora - GCC" он выводит именно то, что я его накормил. но в моей системе друзей (32 бит, MS XP, MinGW) он печатает 90ABCDEF. Я не понимаю, почему. кто-нибудь знает?

BTW: sizeof(unsigned long long int) в его системе 8.

Ответ 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 выдаст предупреждение, когда увидит, что в литеральной форматированной строке, потому что он предполагает, что у него будет лучшая библиотека времени выполнения.)