C++中*(int*)&运算符作用、与bitset关联及sizeof(int)*8含义
C++代码问题解答
问题1:*(int*)&f的作用及与bitset的运行关联
我们可以把这行代码拆成三步理解:
- 首先
&f是取float变量f的内存地址,此时得到的指针类型是float* - 中间的
(int*)是强制类型转换,告诉编译器暂时忽略这个地址原本指向的是float类型,把它当作指向int类型的指针处理 - 最外层的
*是对转换后的int指针做解引用,直接把f对应内存里存储的原始二进制内容,原样读取出来赋值给int变量x
这里要注意:这个操作不是普通的浮点数转整数(比如不会把3.9f转成3),而是做内存二进制位的逐位拷贝,属于类型双关的常用技巧,目的是拿到float类型的IEEE 754编码原始二进制值。
和bitset的关联:标准库的bitset构造函数不支持直接传入float类型参数,只能接受整数类型的输入。我们把float的原始二进制转成等价的int值之后,才能正常传入bitset构造函数,实现浮点数全位二进制的打印。
问题2:sizeof(int) * 8中乘以8的作用
sizeof运算符返回的是某一类型占用的字节数,而bitset的模板参数要求传入的是需要存储的二进制位数量。1字节等于8个二进制位,所以乘以8就是计算当前平台下int类型总共有多少个二进制位,确保bitset的容量刚好可以装下int的全部二进制位,不会出现位丢失或者多余无效位的问题。比如常见的32位平台int占4字节,4*8=32,刚好对应32位float的全部编码位。
内容的提问来源于stack exchange,提问作者shiraori
相关产品推荐
相关产品推荐

