printf("%llx")有什么问题?

Unt*_*led 12 c types platform-independent

我有这段代码,它挑战了我对C的所有知识.我在这里:

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

    scanf("%llX", &massage); //input: 0x1234567890abcdef
    printf("%llX", massage);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的"64位 - Corei5 - Fedora - GCC"上,它打印出了我喂它的确切内容.但在我的好友的系统(32位,MS XP,MinGW)上打印90ABCDEF.我不明白为什么.有人知道吗?

BTW:sizeof(unsigned long long int)他的系统是8.

rua*_*akh 10

问题是编译器认为(反映在sizeof:sizeof(unsigned long long int)在编译时进行评估)与运行时库相信的内容之间存在差异(如下所示printf:printf函数在运行时被调用,因此当其格式时 -说明符生效).

根据MinGW文档中的"C99":

GCC不包含C运行时库.这是由平台提供的.GCC的MinGW端口使用Microsoft的原始(旧)Visual C运行时MSVCRT,它是Microsoft Visual Studio 6(1998年发布)的目标.

[...]

因为MinGW依赖于MSVCRT,所以它具有许多与Visual Studio 6兼容的限制和怪癖.您应该假设MinGW应用程序不能仅依赖于C99的C99行为.例如,不支持printf中较新的格式字符,如%a和%ll,尽管%ll存在一种解决方法.

(它提到的解决方法是使用I64而不是ll:所以,%I64X.令人讨厌的是,至少在我的系统上,GCC会在看到文字格式字符串时发出警告,因为它假设它会有更好的运行 -时间库.)