5

専門家の指導が必要な質問があります。

  1. 型を持つ値がshort引数として関数に渡されると、printf()自動的に型に昇格されます。intそのため、printf()関数は値をint型ではなくshort型として認識します。

  2. したがって、基本的にshort型は 16 ビット幅であり0000000000000000int型は 32 ビット幅であり、00000000000000000000000000000000.

  3. 型で変数呼び出しを宣言し、num-32の値で初期化するとします。つまり、型shortの最上位ビットは になります。これはです。short10000000011100000

  4. この値を に渡すと、型にprintf()変換されるので になります。int00000000000000000000000011100000

  5. 手順 4 で に変換するintと、最上位ビットは になり0ます。

  6. %hd指定子または指定子を使用しても%d、正の値ではなく負の値を求めるプロンプトが表示されるのはなぜですか?

4

3 に答える 3

9

いいえ、short と int は両方とも符号付きの型であるため、0 バイトのパディングではなく符号拡張によって昇格されます。

-32 short =                   11111111 11100000 
-32 int   = 11111111 11111111 11111111 11100000

MSB を 1、つまり負のままにします。

最初に署名なしでキャストすることにより、期待する動作を偽造できます。

printf("%d", (unsigned short)((short)(-32)));
于 2011-05-09T09:23:09.213 に答える
2

あなたが言うように、それは変換され、この場合の変換は知識を意味します。つまり、コンパイラは、signed short から int への変換がどのように機能するかを認識しています。前にビットを追加するだけでなく、short と同じ値で新しい int を作成します。そのため、正しい番号が取得されます。

于 2011-05-09T09:25:14.987 に答える
2

short を int に変換すると、基本的に short の最上位ビットが int の上位 16 ビットに複製されます。これが、int が負として出力される理由です。を使用してこの動作を望まない場合は、ushort.

于 2011-05-09T09:22:26.087 に答える