返回信息流#include<stdio.h>
typedef char *pointer;
void show(pointer p,int n)
{
int i;
for(i=0;i<n;i++)
printf(" %x",p[i]);
printf("\n");
}
int main()
{
int n=32769;
show((pointer) &n,sizeof(int));
printf(" %x\n",n);
return 0;
}
第一个printf结果为什么多了很多f
这是一条镜像帖。来源:北邮人论坛 / cpp / #13002同步于 2008/9/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
数在内存中的存放方式
langyu
2008/9/24镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
因为0x80是 1000,0000b
猜测这里是因为p[i]本身是一个char,被认为是一个负数。用%x来打印的话,最高位的1被展到前3个字节里了。
你换%d看看。。。
gcc里的结果是:
80ffffff80
【 在 windam (棒棒糖) 的大作中提到: 】
: 试了一下,看看这两者的差别
: printf ("%x", 0x80);
: printf ("%x", (char)0x80);
: ...................
想了一下,觉得这个跟编译器的实现可能有关。
在进行参数压栈的时候,每压一个参数可能都需要是一个4字节的数。(猜测的)
一个单字节的参数在这里需要被展成4字节。
尤其像printf这种可变参数的函数,他的参数类型不确定,更可能出现不同的实现方法了。
可能一个有符号char就会按照最高位直接填充前3个字节。也可能会有别的方法。。。= =
【 在 windam 的大作中提到: 】
: 想了一下,觉得这个跟编译器的实现可能有关。
: 在进行参数压栈的时候,每压一个参数可能都需要是一个4字节的数。(猜测的)
: 一个单字节的参数在这里需要被展成4字节。
: ...................
嗯,反汇编跟了一下,printf在把参数入栈的时候是如下流程
movsx ecx,byte ptr [xxx];
push ecx;
这个movsx是符号扩展的,符号位为0的高位都填为0,符号位为1的高位都填1,01->00000001
80->ffffff80
不清楚为什么还要符号扩展。
【 在 rebirthatsix (茫犭者-算法盲) 的大作中提到: 】
: 嗯,反汇编跟了一下,printf在把参数入栈的时候是如下流程
: movsx ecx,byte ptr [xxx];
: push ecx;
: ...................
【 在 flyingkisser 的大作中提到: 】
: 不清楚为什么还要符号扩展。
嗯,同不解,不过这个%x本身就要求后续参数是integer,如果是32bit, movsx无所了就
不知道编译器是怎么判定的