0
typedef struct AbcStruct{

   short        LD;
   short        EL;
   short        CL;        
   AbcStruct( short b, short res = 0, short lr = 1000): LD( b ), EL(res), CL( lr ) { }
};

int main () 
{

    struct AbcStruct A2(200, 100, 100);

    char *string_ptr = (char *)&A2;
    kk = sizeof(AbcStruct);

    while(kk--)
        printf(" %x ", *string_ptr++);
}

出力 (16 進数の AbcStruct):

ffffffc8  0  64  0  64  0

なぜ最初の要素の出力に 4 バイトが含まれているのか疑問に思ってffffffc8いますc8

ありがとう

4

3 に答える 3

1

これは、印刷している文字の最初のビットが である1ため、文字が負の数として解釈されるためです。デフォルトのフォーマットを使用して印刷している場合、印刷される値は(よりもはるかに大きい)%xとして解釈されます。したがって、記号は他のすべての位置にコピーされ、出力にそれらの s が表示されます。intcharf

1つの修正は、使用して印刷する%hhxことです(値を印刷していると言っprintfていますunsigned char)。

printf(" %hhx ", *string_ptr++);

別の修正は、のタイプを変更するstring_ptrことですunsigned char

unsigned char *string_ptr = (char *)&A2;

または、それらを組み合わせることができます。

于 2012-07-11T10:37:04.047 に答える
0

printf フォーマット指定子で width オプションを使用して、希望するアドレスの文字数を印刷します。たとえば、ここでは %2X をフォーマット指定子として使用できます。

于 2012-07-11T10:33:55.483 に答える
0

printf()指すアドレスから返されたものをstring_ptr.unsigned intではなくunsigned char.

これを試して:

unsigned char *string_ptr = (unsigned char *)&A2;
kk = sizeof(AbcStruct);
while(kk--)
{
    unsigned char c = *string_ptr++;
    printf(" %x ", (unsigned)c);
}
于 2012-07-11T10:27:48.943 に答える