web-dev-qa-db-ja.com

printfのフォーマット(%dと%u)

ポインタアドレスを出力する場合の%d%uの違いは何ですか?

例えば:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
15
kapil

このページ でフォーマットエスケープのリストを見つけることができます。

%dは符号付き整数ですが、%uは符号なし整数です。ポインタ(数値として扱う場合)は通常、負ではありません。

実際にポインタを表示したい場合は、%pフォーマット指定子。

27
GManNickG

%u符号なし整数を出力します

%dは符号付き整数を出力します

ポインタアドレスを取得するには、%pを使用します

エスケープのフォーマットのその他のリスト:

書式設定エスケープの完全なリストを以下に示します。 このページ のスクリーンショットを提供しています。

enter image description here

7
alamin

あなたの質問を正しく理解できれば、%pは、ポインタが使用しているアドレスを表示します。次に例を示します。

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

次のようなものを出力します:

-1083791044, 3211176252, 0xbf66a93c
6
Luca Matteis

%uは、符号なし整数に使用されます。符号付き整数アドレス演算子%dによって指定されるメモリアドレスは-12なので、この値を符号なし整数で取得するために、コンパイラはこのアドレスの符号なし整数値を返します。

1
user2560622

違いは単純です。コンパイル時に異なる警告メッセージが表示されます。

1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %d\n", &a); // prints "memory add=-12"
                               ^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %u\n", &a); // prints "memory add=65456"
                               ^

ポインタをvoid*として渡し、%pを変換指定子として使用すると、エラーメッセージは表示されません。

#include <stdio.h>

int main()
{
    int a = 5;
    // check the memory address
    printf("memory address = %d\n", &a); /* wrong */
    printf("memory address = %u\n", &a); /* wrong */
    printf("memory address = %p\n", (void*)&a); /* right */
}
1
Toby Speight