64,654
社区成员
发帖
与我相关
我的任务
分享
//&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
#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
// 地址 值
cout<<
(
(
*(char *) ( //第二步,把 第一步的结果转换成 char *型,然后解引用
(int)(&str)+i //第一步,先把 str的地址转换成int然后+1
)
) & 1 //第三步,把第二步的结果和数值1进行与运算。
);