gpt4 book ai didi

c++ - 将 uint32 读取为没有溢出的 float ?

转载 作者:行者123 更新时间:2023-11-28 06:38:28 25 4
gpt4 key购买 nike

我正在开发一个执行此类操作的程序:它采用浮点值数组,并在 base64 字符串中对这些值进行三乘三编码。当整个数组被编码时,如果还有一些值剩余(数字 < 3),它将对它们进行编码并添加必要的 '='(有关更多信息,请参阅 here )。

反正问题不在这里。我的问题是,在这个 base64 字符串的最开始,我需要指示后面的 float ,但作为 uint32。但是,我被迫使用 float 来使用我的函数...所以我必须使用 hack,并初始化指向 uint32 的指针,但将其作为 float 读取。

这是我的做法:

uint32_t *ivalue = (uint32_t *)malloc(sizeof (uint32_t));
float *fvalue = (float *)ivalue;
// (...) some code
*ivalue = 2 * sizeof (float); // The value I want, 2 * 4 in this case (on my computer)
tempoCoor.push_back(*fvalue);

tempoCoor 是我填充的 ​​std::vector,当大小为 3 时,我对其内容进行编码并清空。

但是,我的hackish 方法有问题...当我计算小于 256 的值时(我认为这是这个值),一切都很好,但当我的值更大时就不行了或等于 256。这是为什么呢?我该如何解决?

如果我有任何不清楚的地方,请问我更多细节。如果需要,我可以解释更多。

最佳答案

好的,所以这里有一些关于该代码错误的解释:
1. 为什么在 C++ 中使用 malloc?这是一个坏习惯,只有在少数特殊情况下才合适。请改用 new! (也不要转换 malloc [在 C 中] 或至少使用 C++ 转换)
2. 为什么还要在堆上分配内存?在这种情况下似乎完全没有必要。
3. 不要在 C++ 代码中使用 C 风格的转换 - C++ 转换(static_cast 等)更安全并且包含一些错误检查。

下面是这段代码的样子。

uint32_t ivalue = 2 * sizeof(float); //simply assigning the value  
// ... some Code
tempoCoor.push_back(static_cast<float>(ivalue)); //using proper C++ cast to convert

当您在堆上使用内存并直接访问它时,通过重新解释一个指针(相当于 reinterpret_cast)您正在使用写入那里的数据,就好像它是一个 float ,显然不是。一旦您的值变得足够大,一些位就会被解释为指数的一部分,您会收到错误的值。

关于c++ - 将 uint32 读取为没有溢出的 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379977/

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