gpt4 book ai didi

c++ - 为什么 "%I64d"在同一格式字符串中多次使用时会给出奇怪的输出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:50 25 4
gpt4 key购买 nike

当我在 codeforces 上解决一个编程问题时,我发现当格式说明符“%I64d”在同一格式字符串中被多次使用时,例如:

long long int a, b, c;
a = 1, b = 3, c = 5;
printf("%I64d %I64d %I64d\n", a, b, c);

输出是

                                                               1                                                                0                                                                3 

然而,当我将每个说明符分开时,例如:

long long int a, b, c;
a = 1, b = 3, c = 5;
printf("%I64d ", a);
printf("%I64d ", b);
printf("%I64d ", c);
puts("");

输出如预期的那样:

                                                           1                                                                3                                                                5 

这是查看上述代码片段的 ideone 链接: http://ideone.com/f2udRB

请帮我理解为什么会这样?如果这是未定义的行为,如何显示这样的输出?有时显示此类意外输出时,我如何理解原因?

最佳答案

对于格式字符串 %I64d printf() 期望堆栈上有一个 4 字节的数字,因为对于 GNU printf I 意味着, “使用替代输出数字”,64 表示“填充到 64 个字符”。剩下的d代表一个带符号的32位整数。

但是你推的是 8 字节的数字,因为 a, b, clong long 类型。

数字低于 2^32,所以在堆栈上您会看到(以 4 字节为单位)

1 0 3 0 5 0

只有前 3 个数字被 printf 解释,其余的被丢弃。当您使用 %lld 时,printf() 会将堆栈数据正确解释为 8 字节数字。

关于c++ - 为什么 "%I64d"在同一格式字符串中多次使用时会给出奇怪的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com