質問

printf の man ページを眺めていたところ、何かが思いつきました。私は、比較的単純な質問に答えられる「言語弁護士」がここにいるだろうかと思っていました :-P.

したがって、「t」修飾子は次のように定義されます。

次の整数変換 ptrdiff_t引数に対応します。

それで、何ですか 想定 これを符号なし整数変換と組み合わせるとどうなるでしょうか?明らかに、o、u、x、X はすべて符号なしの値として解釈されることを意図していますが、d と i は符号付きです。

同様に、すべての修飾子には符号付き/符号なしのバージョンがあります (int/unsigned int、 size_t/ ssize_t, 、など)を除く ptrdiff_t.

実際には、型の署名なしバージョンは署名付きバージョンと同じ量のスペースを占有するため、悪いことは何も起こりません。したがって、適切なバイトがスタックからポップされます。

したがって、実際、「」を除くすべてのテスト対象の期待値を出力する場合、「悪いこと」は何も起こりませんINT_MIN" (仮定して sizeof(int) == sizeof(ptrdiff_t).

printf("%tu %td\n", INT_MIN, INT_MIN);

プリント

2147483648 -2147483648

32 ビット システム上。

この点に関して規格は何か意見はありますか?答えは「未定義の行動」だと思います。でも、;)聞いてみようと思いました。

役に立ちましたか?

解決

ここには何も見るべきものはありません。あなたが書いたコードは合法です。

その理由に関するいくつかの事実:

  • すべての符号付き整数型には、同じサイズ/アライメント要件を持つ符号なしの対応するものがあります。
  • ptrdiff_t 標準では符号付き整数型であることが規定されています。したがって、符号なしの双子が存在します。(実際、同様のロジックが次の場合にも適用されます) size_t 同じように - ssize_t CではなくPOSIXです)
  • t 長さ指定子は機能する必要があります d, i, o, u, x, X 種類
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top