这行代码到底干了什么?

ZiyData 2010-03-14 05:31:41
int main()
{
unsigned char str=1;
for(int i=0;i<8;i++)
{
cout<< ( (str<<i) & 1 );
}

cout<<endl;
for(int i=0;i<8;i++)
{
cout<< ( ( *(char *)( (int)(&str)+i )) & 1 ); //这行代码到底干了什么 ?
}
cout<<endl;
_getch();

}

望高人解答!
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZiyData 2010-03-16
  • 打赏
  • 举报
回复
哦,呵呵,自己犯了低级错误,不好意思,
int(&str) + i 后,加的是地址值,1个地址值是8位,
我以为加的是位,所以错了! 不好意思,让大家见笑了,O(∩_∩)O哈哈哈~
ypb362148418 2010-03-14
  • 打赏
  • 举报
回复
输入一组值自己测试一下,然后再调试一遍就知道了
机智的呆呆 2010-03-14
  • 打赏
  • 举报
回复
如果lz用的不是vc,或者没有开启堆栈帧(/RTCs)编译选项,那么*(char *)( (int)(&str)+i )) :从i=1开始,访问越界了,这些空间未被初始化,最后的值也是随机的了
机智的呆呆 2010-03-14
  • 打赏
  • 举报
回复
*(char *)( (int)(&str)+i )) :从i=1可以就是越界访问栈上的其他空间,在vc下这段空间默认被初始化成了cc(开启堆栈帧(/RTCs)编译选项),结果是0;
机智的呆呆 2010-03-14
  • 打赏
  • 举报
回复

//&str取变量str的地址,这个值被默认解析成一个char*指针变量的值

//(int)(&str)把地址值强制转化成int变量的值,这步强制转换没啥作用,因为&str是char*的。如果
//&str是int*这步的强制转换就有效果了,假设&str默认被解析成int*型,那么(&str)+i 值是(int)(&str)+sizeof(int)
//也就是说如果 int*p;假设p=0x00000000,p=p+1;则p此时值为0x00000004;而(int)p+1值是0x00000001

//(char *)((int)(&str)+i ):((int)(&str)+i )值强制以char*指针变量方式解析

//( *(char *)( (int)(&str)+i )):对(char *)((int)(&str)+i )解引用,实质是把地址值为(char *)((int)(&str)+i )内存里的数据按照
//char类型数据的组织方式取出,即结果是char变量的值

//( *(char *)( (int)(&str)+i )) & 1 :即( *(char *)( (int)(&str)+i )) &0x00000001,显然如果*(char *)( (int)(&str)+i ))这个
//char变量值换算上二进制,最低位为1,( *(char *)( (int)(&str)+i )) & 1的结果为0,最低位为0,结果也为0
ZiyData 2010-03-14
  • 打赏
  • 举报
回复
xboy ,我输出的不是地址 .... . .
用另一种方式可以解决我的问题,我只是不明白这种方式为什么结果会是那个样子的
xboy 2010-03-14
  • 打赏
  • 举报
回复
如果每次输出都是一样,在你的程序中,那绝对是一次巧合,因为变量在内存中的地址是变化的,你每次执行其地址都可能不同
yuzl32 2010-03-14
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main()
{
unsigned char str=1;
unsigned char *p = 0;
for(int i=0;i<8;i++)
{
cout<< ( (str<<i) & 1 );
}
cout<<endl;

for(int i=0;i<8;i++)
{
cout<< ( ( *(char *)( (int)(&str)+i )) & 1 ); //这行代码到底干了什么 ?
}
cout<<endl;

//
p = &str + 0;
cout<< (int *)p << ' ' << (*p & 1)<< endl;
p = &str + 1;
cout<< (int *)p << ' ' << (*p & 1)<< endl;
p = &str + 2;
cout<< (int *)p << ' ' << (*p & 1) << endl;
p = &str + 3;
cout<< (int *)p << ' ' << (*p & 1) << endl;
p = &str + 4;
cout<< (int *)p << ' ' << (*p & 1) << endl;
p = &str + 5;
cout<< (int *)p << ' ' << (*p & 1) << endl;
p = &str + 6;
cout<< (int *)p << ' ' << (*p & 1) << endl;
p = &str + 7;
cout<< (int *)p << ' ' << (*p & 1) << endl;
//_getch();
}
//output
//10000000
//10000010 <---下面的地址-值和这里对应.
//0012FF73 1
//0012FF74 0
//0012FF75 1
//0012FF76 0
//0012FF77 0
//0012FF78 0
//0012FF79 1
//0012FF7A 0
// 地址 值
ZiyData 2010-03-14
  • 打赏
  • 举报
回复
原本是想通过第二种方法输出 str 的每一位,但是失败了,输出来的结果又点出人意料,不知道为什么
ZiyData 2010-03-14
  • 打赏
  • 举报
回复
我就是不明白,为什么运行的时候跟我想的不一样,
那行代码 每次输出都不一样
xboy 2010-03-14
  • 打赏
  • 举报
回复
这样理解比较好一点

cout<<
(
(
*(char *) ( //第二步,把 第一步的结果转换成 char *型,然后解引用
(int)(&str)+i //第一步,先把 str的地址转换成int然后+1
)
) & 1 //第三步,把第二步的结果和数值1进行与运算。
);

64,654

社区成员

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

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