printf(“%llx”)有什么问题?

时间:2012-12-28 15:22:23

标签: c types platform-independent

我有这段代码,它挑战了我对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。

2 个答案:

答案 0 :(得分:10)

问题是编译器认为(在编译时评估sizeofsizeof(unsigned long long int)中反映的内容)与运行时库认为的内容之间存在差异(如{{1中所反映的那样) }}:printf函数在运行时被调用,因此当它的格式说明符生效时。)

根据"C99" in the MinGW documentation

  

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

     

[...]

     

由于MinGW依赖于MSVCRT,因此它具有许多与Visual Studio 6兼容的限制和怪癖。您应该假设MinGW应用程序不能仅依赖于C99的C99行为。例如,虽然存在workaround for %ll,但不支持printf中较新的格式字符,例如%a和%ll。

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

答案 1 :(得分:3)

Windows C库使用“%I64d”而不是“%lld”来打印参数 输入“long long”。

参考:http://gcc.gnu.org/ml/gcc-patches/2004-11/msg01966.html