5

printf の man ページを調べていたところ、何かが思い浮かびました。比較的簡単な質問に答えることができる「言語弁護士」がここにいるかどうか疑問に思っていました:-P.

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

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

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

同様にsize_t、.ssize_tptrdiff_t

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

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

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

版画

2147483648 -2147483648

32 ビット システムで。

規格はこれについて意見を持っていますか? 答えは「未定義の動作」になると思います。しかし、私は尋ねると思いました;)。

4

1 に答える 1

3

ここには何も表示されません。あなたが書いたコードは合法です。

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

  • すべての符号付き整数型には、同じサイズ/配置要件を持つ符号なし整数型があります
  • ptrdiff_t標準では符号付き整数型として規定されています。したがって、符号なしの双子があります。(実際、同様のロジックが適用さsize_tれますssize_t-CではなくPOSIXです)
  • t長さ指定子は、、、、、、、タイプでd機能する必要ioありますuxX
于 2009-03-31T23:44:50.413 に答える