c语言中内存问题
#include<stdio.h>intmain(){signedlongb;unsignedlonglonga=0xae34bcdf;scanf("%x",&b);//...
#include<stdio.h>
int main(){
signed long b;
unsigned long long a = 0xae34bcdf;
scanf("%x",&b); //输入 11111111
printf("%llx %lx\n",b,a); //为 0xae34bcdf11111111
return 0;
}
如程序所写 为什么会出现这种情况? 我取了两个变量的地址看 一个是10~13 一个是1c~23 能说下为什么会出现这种情况吗? 展开
int main(){
signed long b;
unsigned long long a = 0xae34bcdf;
scanf("%x",&b); //输入 11111111
printf("%llx %lx\n",b,a); //为 0xae34bcdf11111111
return 0;
}
如程序所写 为什么会出现这种情况? 我取了两个变量的地址看 一个是10~13 一个是1c~23 能说下为什么会出现这种情况吗? 展开
5个回答
展开全部
楼主这个地方写错了: printf("%llx %lx\n",b,a);
应该写成 printf("%lx %llx\n",b,a);
至于在写错的情况下为什么输出是那些:
printf("%llx %lx\n",b,a);首先把8字节的a压入栈,然后把4字节的b压入栈,然后调用printf函数根据第一个格式化%llx在栈上去取一个8字节的数,刚好把a的低四位和b的四位拿出来形成了0xae34bcdf11111111。然后再根据第二个格式化%lx去栈上取4字节的数,恰好是a的高4位,所以输出会是0。
应该写成 printf("%lx %llx\n",b,a);
至于在写错的情况下为什么输出是那些:
printf("%llx %lx\n",b,a);首先把8字节的a压入栈,然后把4字节的b压入栈,然后调用printf函数根据第一个格式化%llx在栈上去取一个8字节的数,刚好把a的低四位和b的四位拿出来形成了0xae34bcdf11111111。然后再根据第二个格式化%lx去栈上取4字节的数,恰好是a的高4位,所以输出会是0。
展开全部
因为你的b是long型的,而输出的时候是llx,则long long型的,所以会出现这样的错误
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-11-21
展开全部
函数的调用:a(8个字节入栈)—>b(4个字节入栈)
printf()取上面8个字节
。。。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0xae34bcdf 是个16进制常数
%x %lx 都是表示操作数据按16进制进行处理
所以,输出就是这样子,不知道你所说的情况是这个吗?
%x %lx 都是表示操作数据按16进制进行处理
所以,输出就是这样子,不知道你所说的情况是这个吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种是指哪种情况?没看懂楼主要表达什么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询