_%x
_をprintf()
とともに使用すると、スタックから4バイト(16進数のint
)を印刷していることを知っています。しかし、1バイトだけを印刷したいと思います。これを行う方法はありますか?
仮定:1バイト幅の変数の値、つまりchar
を出力したい。
char
変数、たとえば_char x = 0;
_があり、値を出力する場合は、printf()
で_%hhx
_書式指定子を使用します。
何かのようなもの
_ printf("%hhx", x);
_
それ以外の場合、デフォルトの引数昇格により、次のようなステートメント
_ printf("%x", x);
_
printf()
はstackからsizeof(unsigned int)
を読み取らないため、x
の値はそのタイプに基づいて読み取られるため、正しいとにかく、必要なタイプに昇格されます。
ndefined behaviourを避けるために、これを行う方法に注意する必要があります。
C標準では、int
をunsigned 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
)に変換されることに注意してください。
次のソリューションを使用して、printf
で1バイトを印刷できます。
unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
大きな値タイプに存在する単一バイトを印刷する場合、必要な値をマスクおよび/またはシフトアウトできます(例:int x = 0x12345678; x&0x00FF0000 >> 16)。または、(符号なし)charポインターとオフセットを使用して必要なバイト位置をキャストすることにより、必要なバイトを取得します。