-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を出力する正しい方法ではないことはわかっていますが、この質問を投稿する主な目的は、aの正しい値でbに0を出力するように、longlongの動作を知りたいことです。

4

2 に答える 2

3

誤ったフォーマット指定子を指定したため、コードは未定義の動作を呼び出します。%lldの代わりに使用する必要があり%dます。

未定義の動作である場合、なぜそのように動作するのかを実際に推論することはできません。この入力を推論することはできますが、別の入力セットでは失敗する可能性があります。未定義だからです。または、ドキュメントを見ることができます。それについて何かを言っているかもしれませんが、なぜそれが印刷されているのかを言う必要はありません0

于 2013-01-07T15:38:29.077 に答える
2

long longお使いのマシンでは64ビットタイプのようですintが、32ビットタイプのようです。また、リトルエンディアンのマシンを使用している必要があります。

は可変個引数関数であるためprintf、渡された型を知る唯一の方法は、フォーマット文字列の引数にラベルを付ける方法です。フォーマット文字列に応じて、2つの64ビット引数を送信していますが、32ビットの引数を2つだけ使用しています。つまり、最初の印刷は64ビットの下半分の32ビットの「下半分」で20あり、2番目の印刷は32ビットの「上半分」です(もちろん、これは0)。渡した21ものは完全に無視されます。

于 2013-01-07T15:45:45.097 に答える