web-dev-qa-db-ja.com

printfで1バイトを印刷するには?

_%x_をprintf()とともに使用すると、スタックから4バイト(16進数のint)を印刷していることを知っています。しかし、1バイトだけを印刷したいと思います。これを行う方法はありますか?

5
ahg8tOPk78

仮定:1バイト幅の変数の値、つまりcharを出力したい。

char変数、たとえば_char x = 0;_があり、値を出力する場合は、printf()で_%hhx_書式指定子を使用します。

何かのようなもの

_ printf("%hhx", x);
_

それ以外の場合、デフォルトの引数昇格により、次のようなステートメント

_  printf("%x", x);
_

printf()stackからsizeof(unsigned int)を読み取らないため、xの値はそのタイプに基づいて読み取られるため、正しいとにかく、必要なタイプに昇格されます。

12
Sourav Ghosh

ndefined behaviourを避けるために、これを行う方法に注意する必要があります。

C標準では、intunsigned charにキャストしてから、ポインター演算を使用して必要なバイトを出力できます。

int main()
{
    int foo = 2;
    unsigned char* p = (unsigned char*)&foo;
    printf("%x", p[0]); // outputs the first byte of `foo`
    printf("%x", p[1]); // outputs the second byte of `foo`
}

p[0]およびp[1]は、出力を表示する前に、より広い型(int)に変換されることに注意してください。

4
Bathsheba

次のソリューションを使用して、printfで1バイトを印刷できます。

unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
1
macario

大きな値タイプに存在する単一バイトを印刷する場合、必要な値をマスクおよび/またはシフトアウトできます(例:int x = 0x12345678; x&0x00FF0000 >> 16)。または、(符号なし)charポインターとオフセットを使用して必要なバイト位置をキャストすることにより、必要なバイトを取得します。

0
Ton Plooij