238

16 進数で数字を先頭にゼロを付けた 8 桁の数字として出力すると、 と同じ結果が表示され%#08X ない0x%08Xのはなぜですか?

前者を使用しようとすると、08書式設定フラグが削除され、 だけでは機能しません8

4

5 に答える 5

345

この#部分は0x、出力文字列に a を与えます。0と は、パーツxに記載されている「8」文字に対してカウントされます08。同じにしたい場合は、10文字を要求する必要があります。

int i = 7;

printf("%#010x\n", i);  // gives 0x00000007
printf("0x%08x\n", i);  // gives 0x00000007
printf("%#08x\n", i);   // gives 0x000007

また、 の大文字と小文字を変更するxと、出力される文字の大文字と小文字が変わります。

printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB
于 2013-02-06T16:24:43.640 に答える
62

「0x」は 8 文字カウントにカウントされます。が必要"%#010x"です。

0x を 0 に追加しないことに注意してください。結果は#ようになり0000000000ます。したがって、実際には"0x%08x"とにかく使用する必要があります。

于 2013-02-06T16:25:22.863 に答える
41

%#08X変換は、値の前に ; を付ける必要があります0X。これは規格で要求されています。プレフィックスが長さの一部としてカウントされることを除いて、仕様#の一部の動作を変更する必要があるという証拠は標準にありません(したがって、を使用したい/必要がある場合があります。私のように、16進数が、その後、目的の結果を達成するために使用する必要があります. and を使用することもできます.080X%#010X0x1234CDEF0x%08X%#.8X

次のコードのバリエーションを試してください。

#include <stdio.h>

int main(void)
{
    int j = 0;
    printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    for (int i = 0; i < 8; i++)
    {
        j = (j << 4) | (i + 6);
        printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
    }
    return(0);
}

RHEL 5 マシンとMac OS X v10.7.5 (Lion) の出力は次のとおりです。

0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd

0 の扱いには少し驚いています。接頭辞が省略されている理由はよくわかりませ0Xんが、2 つの別々のシステムがそれを行っているため、標準である必要があります。#それは、このオプションに対する私の偏見を裏付けるものです。


ゼロの扱いは規格による。

ISO/IEC 9899: 2011 §7.21.6.1関数fprintf

¶6 フラグ文字とその意味は次 #のとおりです。 ... 結果は「代替形式」に変換されます。... x(or X) 変換の場合、ゼロ以外の結果には0x(or 0X) が前に付きます。...

(強調を追加しました。)


using は、16 進数とプレフィックスとして%#X大文字を使用することに注意してください。0Xusingは、16 進数とプレフィックスとして%#x小文字を使用します。プレフィックスと大文字を使用する場合は、個別にコーディングする必要があり0xます: . もちろん、必要に応じて他のフォーマット修飾子を追加することもできます。0x0x0x%X

アドレスを印刷するには、<inttypes.h>ヘッダーとuintptr_tタイプおよびPRIXPTRフォーマット マクロを使用します。

#include <inttypes.h>
#include <stdio.h>

int main(void)
{
    void *address = &address;  // &address has type void ** but it converts to void *
    printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
    return 0;
}

出力例:

Address 0x7FFEE5B29428

長さの毒を選択してください — macOS を実行している Mac のアドレスには、12 の精度が適切に機能することがわかりました。と組み合わせて.最小精度 (桁数) を指定すると、住所が確実にフォーマットされます。精度を 16 に設定すると、Mac での私の経験では、余分な 4 桁は常に 0 になりますが、移植可能な 64 ビット コードでは 12 ではなく 16 を使用するケースが確かに存在します (ただし、精度には 8 を使用します)。 32 ビット コード)。

于 2013-02-06T16:25:35.813 に答える
-1

8 ビットの 16 進数を表示するには、いつでも "%p" を使用できます。

int main (void)
{
    uint8_t a;
    uint32_t b;
    a = 15;
    b = a << 28;
    printf("%p", b);
    return 0;
}

出力:

0xf0000000
于 2021-02-23T09:52:41.947 に答える