C++ 如何将整数位放入浮点?

C++ 如何将整数位放入浮点?,c++,C++,我把顶点作为float_3引入。我想给它们添加一个整数,然后将它们作为float_4发送出去。我不想将整数转换为具有相同值的浮点,我需要位完全相同(整数是一个移位在一起的桶xyz值) 以下是我尝试过的: void tagVerts (vector<float_3> &Verts, vector<float_4> &Output) { int len = Verts.size(); for (int i = 0; i < len; i+

我把顶点作为float_3引入。我想给它们添加一个整数,然后将它们作为float_4发送出去。我不想将整数转换为具有相同值的浮点,我需要位完全相同(整数是一个移位在一起的桶xyz值)

以下是我尝试过的:

void tagVerts (vector<float_3> &Verts, vector<float_4> &Output) {
    int len = Verts.size();
    for (int i = 0; i < len; i++) {
        Output[i].xyz = Verts[i];
        Output[i].w = reinterpret_cast<float>(XYZTag(Verts[i]));
    }
}
void标记顶点(向量和顶点、向量和输出){
int len=Verts.size();
对于(int i=0;i
它表示无效的类型转换:/

编辑: float_3和float_4来自amp.h,据我所知,它们只是一个结构中的3或4个float,带有一组转换和赋值辅助函数

XYZTag如下所示:

int XYZTag(float_3 pos) {
    pos = pos * mul + add;
    int_3 posi (static_cast<int>(pos.x), static_cast<int>(pos.y), static_cast<int>(pos.z));
    return((posi.x << 10) + posi.y << 10) + posi.z;
}
int XYZTag(浮动位置3){
pos=pos*mul+add;
int_3 posi(静态_cast(pos.x)、静态_cast(pos.y)、静态_cast(pos.z));

return((posi.x
reinterpret\u cast
不会将
int
重新解释为
float
,但它可以重新解释指针

int temp = XYZTag(Verts[i]);
Output[i].w = *reinterpret_cast<float*>(&temp);
//            ^                      ^  ^
int-temp=XYZTag(垂直[i]);
输出[i].w=*重新解释铸件(&temp);
//            ^                      ^  ^

这将把
int
的精确位填充到
浮点输出[i].w
。确保这些类型的大小相同是您的责任。

您不能
直接重新解释
int
转换。
静态转换将不会执行您想要的操作

要将位模式复制到另一种类型,您需要:

int val = 23;
float bitCopy = *reinterpret_cast<float*>(&val);
int val=23;
浮点位复制=*重新解释强制转换(&val);
现在,为了让这一切正常工作,您最好使用相同的
sizeof(float)
sizeof(int)


此外,我们还必须假设您知道您要做什么来实现这一点。

您不能将
int
的位解释为
float
,因为这样做会违反并因此调用未定义的行为。正确的方法是使用
memcpy
复制位

#include <cstring>

inline float
int_bits_to_float(const int bits)
{
  static_assert(sizeof(int) >= sizeof(float), "too few bits");
  float target;
  std::memcpy(&target, &bits, sizeof(float));
  return target;
}
#包括
内联浮点
整数位到浮点(常量整数位)
{
静态断言(sizeof(int)>=sizeof(float),“位太少”);
浮动目标;
std::memcpy(&target,&bits,sizeof(float));
回报目标;
}

乍一看,这是一个非常糟糕的解决方案,我们真的应该期望编译器能够将其优化为几个移动指令。GCC甚至在默认优化级别也会这样做。

如何定义
float\u 3
float\u 4
XYZTag
呢?您不能
重新解释(an_int)
-使用
静态(an_int)
,或者完全不使用强制转换,编译器将隐式执行。但这只会得到值,它肯定会被更大的数字弄乱,我需要精确的位,以便在它们到达目标后可以进行反转。在vs2012中不直接工作,编译器要求左值这甚至违反了严格的别名规则如果
sizeof(int)==sizeof(float)
reinterpret\u cast
更短。