以十六进制格式打印Data结构值

时间:2012-07-11 10:19:37

标签: c++

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当我预期它只会打印c8

由于

3 个答案:

答案 0 :(得分:1)

这样做是因为您打印的char的第一位是1,因此char被解释为负数。当您使用默认的%x格式进行打印时,要打印的值将被解释为int(远大于char)。因此,对所有其他位置的符号gets copied,使您在输出中看到f个。

一种解决方法是使用%hhx打印(您告诉printf您正在打印unsigned char值)。

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

另一种解决方法是将string_ptr的类型更改为unsigned char

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

或者,您可以将它们组合在一起。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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