您的位置:首页 > 其它

关于 (int&)a 的一些讨论

2010-08-11 20:37 309 查看
发信人: 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 (CeSium), 信区: CPlusPlus 

标 题: 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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: