14

我有这段代码挑战了我对 C 的所有知识。这里我有:

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

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

在我的“64bit - Corei5 - Fedora - GCC”上,它会准确地打印出我输入的内容。但在我好友的系统(32 位、MS XP、MinGW)上,它会打印90ABCDEF. 我不明白为什么。有人知道吗?

顺便说一句:sizeof(unsigned long long int)在他的系统上是 8。

4

2 回答 2

11

问题是编译器所相信的(反映在sizeofsizeof(unsigned long long int)在编译时评估)和运行时库相信的(反映在printfprintf函数在运行时被调用,所以这是它的格式 -说明符生效)。

根据MinGW 文档中的“C99”

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

[…]

因为 MinGW 依赖于 MSVCRT,它有许多与 Visual Studio 6 相同的限制和兼容性问题。您应该假设 MinGW 应用程序不能依赖 C99 行为,只能依赖 C89。例如,不支持 printf 中较新的格式字符,如 %a 和 %ll,尽管存在%ll 的解决方法

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

于 2012-12-28T15:29:29.303 回答
4

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

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

于 2012-12-28T15:28:55.027 回答