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
。
由于
答案 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作为格式说明符。