发信人: WinterFarmer (这不是马甲), 信区: CPlusPlus
标 题: 关于强制转换
发信站: 北大未名站 (2010年08月02日10:32:29 星期一), 站内信件
(int&)a 这个应该得到的事a的编码
问题是: (int&) 这是个组合符号吗? 比如 int(int*)这种 先转成指针再转成整形
还是 (int&)的意义就是得到实际编码
float a1=1.0f;
cout<< (int&)a1 <<endl;
显示的值是1.0f的编码
我的问题是 (int&) 在这里的意义是什么
应该是这样:
float a1 = 1.0f;
int *pa = (int *) &a1;
cout << *pa << endl;
或者写得更紧凑些:
float a1 = 1.0f;
cout<<*(int *) &a1<<endl;
总之 (int&)a 就相当于 *(int*)&a
发信人: LancerX ([1;36mC[0;37me[1;36mS[0;37mium), 信区: CPlusPlus [m
标 题: Re: 关于强制转换
发信站: 北大未名站 (2010年08月02日12:56:19 星期一), 转信
这里用int&的是利用引用类型转换来防止float被直接转换成int型数输出,类似的也可以
用指针这样写:
float a1=1.0f;
int *pa=&a1;
cout << *pa << endl;
发信人: gogdizzy (平花星星#我的爱像天使守护你), 信区: CPlusPlus
标 题: Re: 关于强制转换
发信站: 北大未名站 (2010年08月03日11:22:49 星期二), 转信
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y; // オテオスオトハヌ1/sqrt」ィnumber」ゥ
}
int ftol(float f)
{
int a = *(int*)(&f);
int sign = (a>>31);
int mantissa = (a&((1<<23)-1))|(1<<23);
int exponent = ((a&0x7fffffff)>>23)-127;
int r = ((unsigned int)(mantissa)<<8)>>(31-exponent);
return ((r ^ (sign)) - sign ) &~ (exponent>>31);
}