%u
符号なしの数値に使用されます。変数のアドレスを表示する代わり
に使用すると、同じ結果が得られます。
私たちは倫理のためだけに使用しますか、それとも実際の違いを生みますか.
見てください:%d
%u
%u
int i=5;
printf("Address of i: %d", &i);
以下と同じです:
printf("Again, address: %u" ,&i);
[編集]異なる出力を生成する例をいただければ幸いです。
何度も左右を見ずに横断でき、車にひかれる心配もありません。それは良い考えだという意味ではありません。
%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
実際、さえ"%u"
間違っています。あなたが使用しなければならないポインタのために"%p"
それでも、正の数を見ている限り、アーキテクチャでは符号付きと符号なしの数値は同じ表現%d
を持っているため、 -instead-of-は機能します。したがって、 にポインターを渡すと、はパラメーターを符号付き整数として解釈しようとし、ポインターの上位ビットが設定されていない限り、同じ結果が得られます (通常、これは user-モードポインタ); そうしないと、 で負の数が得られ、で正の数が得られます (マシンが 2 の補数演算を使用していると仮定します)。%u
%d
printf
%u
%d
%u
興味深いことに、最大のエラーは符号の不一致ではなく、ポインター指定子 ( ) の代わりに整数指定子 (%d
および) を使用していることです。実際、ほとんどの 64 ビット アーキテクチャでは 32 ビットですが 64 ビットであるため、代わりにfor を使用すると、アドレスの半分 (x86_64 などのリトル エンディアン アーキテクチャでは下半分) しか表示されません。%u
%p
int
void *
%u
%p
注意: この説明はすべて、C 言語の「典型的な実装」に基づいています。標準に関する限り、フォーマット指定子と実際のデータのタイプが一致しない場合、「未定義の動作」 (= クラッシュからピンク色のユニコーンがプリンターから飛び出すまで) に陥ります。