为什么 printf() 在实际数据之前打印 ffffff。 C
Why does printf() print ffffff before actual data. C
printf() 函数打印前导 ffffff(从技术上讲,我知道最高有效位带有符号,因此它会一直传送到数据开始的位置)。但是我不知道如何摆脱它们,为什么会这样?
int mem_display(Cmd *cp, char *arguments)
{
int i;
char *adr;
if (!sscanf(arguments,"%x",&adr))
{
return 0;
}
printf("%#0.8s ",arguments);
for (i=0; i<16; i++) {
printf("%02.x ",(unsigned int)*(adr+i));
}
...
输出:
% UNIX> md 10668
/*calling function show memory location 0x10668*/
OUT:
10668 ffffffbc 10 20 ffffffe0 ffffffa0 40 ffffffa2 ffffffa0 44 ffffff9c 23 ffffffa0 20
已解决:
printf("%0.2x ",(unsigned int)*(adr+i));
输出:
UNIX> md 10000
10000 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 .ELF............
请阅读printf()
manual,这是正确的方法
printf("%02x ", (unsigned char) adr[i]);
注意:不要使用这个*(a + i)
符号,特别是在你转换它的时候。取消引用指针的方法不错,只是在这种特定情况下不合适。
转换为 unsigned char
让系统将 *(adr+i)
视为无符号,这样就不会进行符号扩展。
for (i=0; i<16; i++) {
printf("%02.x ",(unsigned char)*(adr+i));
}
printf() 函数打印前导 ffffff(从技术上讲,我知道最高有效位带有符号,因此它会一直传送到数据开始的位置)。但是我不知道如何摆脱它们,为什么会这样?
int mem_display(Cmd *cp, char *arguments)
{
int i;
char *adr;
if (!sscanf(arguments,"%x",&adr))
{
return 0;
}
printf("%#0.8s ",arguments);
for (i=0; i<16; i++) {
printf("%02.x ",(unsigned int)*(adr+i));
}
...
输出:
% UNIX> md 10668
/*calling function show memory location 0x10668*/
OUT:
10668 ffffffbc 10 20 ffffffe0 ffffffa0 40 ffffffa2 ffffffa0 44 ffffff9c 23 ffffffa0 20
已解决:
printf("%0.2x ",(unsigned int)*(adr+i));
输出:
UNIX> md 10000
10000 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 .ELF............
请阅读printf()
manual,这是正确的方法
printf("%02x ", (unsigned char) adr[i]);
注意:不要使用这个*(a + i)
符号,特别是在你转换它的时候。取消引用指针的方法不错,只是在这种特定情况下不合适。
转换为 unsigned char
让系统将 *(adr+i)
视为无符号,这样就不会进行符号扩展。
for (i=0; i<16; i++) {
printf("%02.x ",(unsigned char)*(adr+i));
}