可能重复:
Using printf function
#include<iostream>
using namespace std;
int main()
{
long long a=20;
long long b=21;
printf("%d %d",a,b);
}
输出:20 0
有人可以解释一下这种行为吗? [编辑] 我知道%d不是长打印的正确方法但是发布这个问题的主要目的是我想知道long long的行为,以便它为b打印0而正确值为a。
答案 0 :(得分:3)
迂腐地说,您的代码调用了未定义的行为,因为您提供了不正确的格式说明符。您应该使用%lld
代替%d
。
当它是未定义的行为时,你无法真正推断出它为什么会这样。您可以推断出此输入,但随后可能会因另一组输入而失败。因为它是未定义的。或者你可以看到文档,可能说些什么,但不需要说出打印0
的原因。
答案 1 :(得分:2)
在您的计算机上看起来long long
是64位类型,而int
是32位类型。你也必须使用小端机器。
因为printf
是一个可变函数,所以它能够知道传递给它的类型的唯一方法是如何在格式字符串中标记参数。根据您的格式字符串,您正在发送两个64位参数,但只使用两个32位参数。这意味着第一个打印是64位20
的低32位“下半部分”,第二个打印是32位“上半部分”(当然,{{1} })。您传递的0
完全被忽略。