gpt4 book ai didi

c++ - 关于编译器输出的异或浮点值和一般转换问题

转载 作者:行者123 更新时间:2023-11-28 01:27:16 31 4
gpt4 key购买 nike

好吧,这两个问题都与我的编译输出有关,因为我试图删除所有警告..

对于第一个问题:
我正在异或浮点值,编译器输出:警告:取消引用类型双关指针将打破严格别名规则 [-Wstrict-aliasing]

inline float ClassXY::GetFloat(void) const
{
uint32_t xored = *(uint32_t*)&m_pParent->m_Value.m_fValue ^ (uint32_t)this; // compiler warning for this line
return *(float*)&xored;
}

m_pParent 是指向此类 ClassXY *m_pParent;
m_Value 是结构的 var,m_fValue 被定义为结构内的 float 。

知道如何绕过警告吗? (我知道我可以禁用警告,但我不知道如何得到一个干净的解决方案)

我的第二个问题是:
场景几乎相同,只是使用了 int。编译器正在谈论信息丢失:警告:从“const ClassXY*”转换为“uint32_t {aka unsigned int}”会丢失精度 [-fpermissive]
没有 -fpermissive 编译器标志,我将无法编译..

inline int ClassXY::GetInt(void) const
{
return (int)(m_pParent->m_Value.m_nValue ^ (int)this); // compiler warning for this line
}

再一次,关于如何解决这个问题有什么想法吗?
还是在没有警告的情况下不可能实现我想要完成的目标?

为了让大家了解它的含义:自动示例 = g_pClassXY->FindVar("example_var");
然后: float float_val = example->fValue;//直接访问,值不对
要获得正确的值,正确的方法是:float float_val = example->GetFloat();

提前致谢!

最佳答案

为了避免严格的别名冲突,代码可以是:

static_assert( sizeof(float) <= sizeof(uint32_t), "size problem" );
uint32_t xored{};
memcpy(&xored, &m_pParent->m_Value.m_fValue, sizeof xored);
xored ^= reinterpret_cast<uint32_t>(this);

float ret;
memcpy(&ret, &xored, sizeof ret);
return ret;

但是仍然存在一些问题:

  • 代码在 this 是 64 位指针的系统上格式错误。
  • 涉及的浮点值可能是 float 的无效位模式,导致未定义的行为。

如果您的意图是“加密”一个 float ,那么加密值应该存储为 uint32_t 或字节数组,而不是 float

第一个要点可以通过为每个实例生成一个随机的 32 位掩码来解决,而不是使用 this;或使用 uintptr_t 而不是 uint32_t

关于c++ - 关于编译器输出的异或浮点值和一般转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199649/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com