2017-01-13 4 views
1

printf()と使用する場合、スタックから4バイト(16進数でint)を印刷しています。しかし、私は1バイトしか印刷しません。これを行う方法はありますか?printfで1バイトを印刷する方法は?

+1

言語にタグを付ける必要があります。これはCですか? – Bathsheba

+0

あなたの前提は正しくありません。 'printf("%x "、x)'は 'x'の値を16進形式で表示します。 'x'のサイズは'(int) '型とみなされますが、必ずしも4バイトであるとは限りません。 – giusti

+0

Cタグを追加しました。私は*私の答えは正しいと思う、そうでなければdownvoteしてください。 – Bathsheba

答えて

3

の定義されていない動作を回避するには、どのように注意する必要がありますかp[0]p[1]が広いタイプ(int)に変換されていることを

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` 
} 

注:

C標準は、あなたがしてポインタ演算を使用して、必要なバイトを印刷unsigned charintをキャストすることができます、出力を表示する前に。

+0

ニース。セマフォを一緒にマッシュしないでください。まれな 'sizeof(int)== 1'では角の問題だけがあります。 printf( "%x \ n"、p [i]); '(size_t i = 0; i chux

0

大きな値の型の1バイトを印刷する場合は、必要な値(たとえば、int x = 0x12345678; x & 0x00FF0000 >> 16)をマスクまたはシフトアウトすることができます。または、(符号なし)charポインタを使用して必要なバイト位置をキャストし、オフセットを使用して必要なバイトを取得するだけです。

6

仮定:1バイト幅の変数の値、つまりcharを出力したいとします。あなたがchar変数を持っている場合は

は、char x = 0;を言うと、値を印刷printf()%hhx書式指定子を使用します。

printf("%hhx", x); 

ような何かにそれ以外の場合は、printf()は、スタックから値をsizeof(unsigned int)を読んでいないだろうとにより、デフォルトの引数のプロモーションに、

printf("%x", x); 

のような文はまた、正しいだろうxはそのタイプに基づいて読み取られ、とにかに必要なタイプに昇格されます。

関連する問題