-3

%u符号なしの数値に使用されます。変数のアドレスを表示する代わり
に使用すると、同じ結果が得られます。 私たちは倫理のためだけに使用しますか、それとも実際の違いを生みますか. 見てください:%d%u
%u

int i=5;
printf("Address of i: %d", &i);

以下と同じです:

printf("Again, address: %u" ,&i);

[編集]異なる出力を生成する例をいただければ幸いです。

4

5 に答える 5

7

何度も左右を見ずに横断でき、車にひかれる心配もありません。それは良い考えだという意味ではありません。

于 2013-05-24T00:37:58.163 に答える
4
  • %d最上位ビットが設定されたアドレス (上位アドレス) に対して負の値が表示されます。
  • %uビットの肯定的な解釈が常に表示されます
  • %pアドレスを印刷するために明示的に予約されているため、これが最適です。

のアドレスを想定して、これを検討してください0xffffffff

#include <stdio.h>

int main () {
    void* val = 0xffffffff;

    printf("d = %d\n", val);
    printf("u = %u\n", val);
    printf("p = %p\n", val);

    return 0;
}

そして、それは出力です:

d = -1
u = 4294967295
p = 0xffffffff
于 2013-05-24T00:41:27.947 に答える
2

実際、さえ"%u"間違っています。あなたが使用しなければならないポインタのために"%p"


それでも、正の数を見ている限り、アーキテクチャでは符号付きと符号なしの数値は同じ表現%dを持っているため、 -instead-of-は機能します。したがって、 にポインターを渡すと、はパラメーターを符号付き整数として解釈しようとし、ポインターの上位ビットが設定されていない限り、同じ結果が得られます (通常、これは user-モードポインタ); そうしないと、 で負の数が得られ、で正の数が得られます (マシンが 2 の補数演算を使用していると仮定します)。%u%dprintf%u%d%u

興味深いことに、最大のエラーは符号の不一致ではなく、ポインター指定子 ( ) の代わりに整数指定子 (%dおよび) を使用していることです。実際、ほとんどの 64 ビット アーキテクチャでは 32 ビットですが 64 ビットであるため、代わりにfor を使用すると、アドレスの半分 (x86_64 などのリトル エンディアン アーキテクチャでは下半分) しか表示されません。%u%pintvoid *%u%p

注意: この説明はすべて、C 言語の「典型的な実装」に基づいています。標準に関する限り、フォーマット指定子と実際のデータのタイプが一致しない場合、「未定義の動作」 (= クラッシュからピンク色のユニコーンがプリンターから飛び出すまで) に陥ります。

于 2013-05-24T00:43:42.787 に答える