printf - 奇怪的类型mishmash结果.有人可以解释一下吗?

Tom*_*omi 2 c c++ printf struct

在处理从二进制文件中读取结构数据类型的简单项目时,我遇到了一个奇怪的printf格式类型mishmash.基本上我大多数时候都使用%u格式来显示无符号整数,而在我的struct中是一个成员,unsigned long long显示带有格式字符的数据的类型会导致一些奇怪的错误和几个小时的搜索错误.

这是一个例子:

struct bar {
    unsigned long long ll;
    unsigned int i1;
    unsigned int i2;
};

int main(void)
{
    bar fubar;
    fubar.ll = 1200;
    fubar.i1 = 2500;
    fubar.i2 = 450;

    printf("Debt: %u Euro, Wallet: %u Euro, Outgoings: %u Euro.\n", fubar.ll, fubar.i1, fubar.i2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

债务:1200欧元,钱包:0欧元,支出:2500欧元.

使用Visual Studio 2013编译.

当然,当我使用%llu格式化时,一切都像预期的那样工作.

这是因为工作方式printf和实施方式造成的吗?

Sou*_*osh 10

unsigned long long是打印%llu.使用不匹配的变量类型会调用未定义的行为.

引用C11,第7.21.6.1章

ll (ELL-ELL)

指定以下d,i,o,u,x或X转换说明符适用于long long int或unsigned long long int参数;

关于UB,

[..]如果任何参数不是相应转换规范的正确类型,则行为未定义.