AMD的一道笔试题

wangyangkobe 2011-10-17 01:27:36

int main()
{
int *p1 = (int*)-1;
int *p2 = NULL;

if (p1 > p2)
{
cout<<"p1>p2"<<endl;
}
else
cout<<"p1<p2"<<endl;


//不明白下面这两个
cout<<p1-p2<<endl; //-1
cout<<p2-p1<<endl; //0
if ((p1-p2)>0)
{
cout<<"p1-p2>0"<<endl;
}
else
cout<<"p1-p2<0"<<endl;
}
...全文
161 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saingel 2011-10-17
  • 打赏
  • 举报
回复
指针是无符号的啊
hackbuteer1 2011-10-17
  • 打赏
  • 举报
回复
看不明白啊
luciferisnotsatan 2011-10-17
  • 打赏
  • 举报
回复
    cout<<p1-p2<<endl;  //-1
0041648C mov esi,esp
0041648E mov eax,dword ptr [MSVCP80D_NULL_THUNK_DATA (41D434h)]
00416493 push eax
00416494 mov ecx,dword ptr [p1]
00416497 sub ecx,dword ptr [p2]
0041649A sar ecx,2
...
cout<<p2-p1<<endl; //0
004164C2 mov esi,esp
004164C4 mov eax,dword ptr [MSVCP80D_NULL_THUNK_DATA (41D434h)]
004164C9 push eax
004164CA mov ecx,dword ptr [p2]
004164CD sub ecx,dword ptr [p1]
004164D0 sar ecx,2

0xffffffff - 0x0 = 0xffffffff
因为是int指针,sar右移2位(即步距4字节),结果还是0xffffffff。-1
0x0 - 0xffffffff = 0x1 sar 2 后就成0了
bdmh 2011-10-17
  • 打赏
  • 举报
回复
求两个指针之间元素的个数
p1-p2的值是-1,然后求个数 ,因为是int型,所以要除4,汇编中是 sar 2,右移两位
p2-p1道理一样

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧