-3

可能重复:
使用 printf 函数

#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 的正确方法但是发布这个问题的主要目的是我想知道 long long 的行为,以便它为 b 打印 0 而为 a 打印正确的值。

4

2 回答 2

3

学究式地说,您的代码调用了未定义的行为,因为您提供了不正确的格式说明符。您应该使用%lld而不是%d.

当它是未定义的行为时,您无法真正推理出它为什么会这样。您可能会对此输入进行推理,但是对于另一组输入可能会失败。因为它是未定义的。或者您可以查看文档,它可能会说明一些内容,但不需要说明为什么要打印0

于 2013-01-07T15:38:29.077 回答
2

在你的机器上看起来long long是 64 位类型,而int32 位类型。您还必须使用 little-endian 机器。

因为printf它是一个可变参数函数,所以它可以知道您传递给它的类型的唯一方法是通过您如何标记格式字符串中的参数。根据您的格式字符串,您正在发送两个 64 位参数,但仅使用两个 32 位参数。这意味着第一个打印是 64-bit 的低 32 位“下半部分”,20第二个打印是 32 位“上半部分”(当然是0)。你通过的21完全被忽略了。

于 2013-01-07T15:45:45.097 回答