質問
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
種類
所属していません StackOverflow