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++);
}

输出(十六进制的 AbcStruct):

ffffffc8  0  64  0  64  0

我想知道为什么第一个元素的输出包含 4 个字节:ffffffc8当我期待它只会 print c8

谢谢

4

3 回答 3

1

这样做是因为您打印的 char 的第一位是1,因此 char 被解释为负数。当您使用默认%x格式打印时,要打印的值被解释为int(远大于char)。因此,符号被复制到所有其他位置,让您在输出中看到那些fs。

一种解决方法是使用打印%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()将从指向的地址返回的内容string_ptr视为一个unsigned int(我猜在您的系统上是 32 位长)而不是一个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 回答
0

使用 printf 格式说明符中的宽度选项来打印任意数量的地址字符。例如,在这里您可以使用 %2X 作为格式说明符。

于 2012-07-11T10:33:55.483 回答