我正在尝试使用像这样的接口(interface)实现一个操作,一个函数 uint64_t foo(uint32_t,uint32_t)
,所以这是一个简单的实现:
#include <iostream>
#include <cstdint>
uint64_t foo(const uint32_t &a, const uint32_t &b) {
return ((reinterpret_cast<const uint64_t &>(a)) +
(reinterpret_cast<const uint64_t &>(b)));
}
int main() {
uint32_t k1 = ~0;
uint32_t k2 = 1;
std::cout << foo(k1, k2) << "\n";
return (0);
}
现在我的重点是 reinterpret_cast
和 +
运算符。
+
运算符应该没问题,因为它被 2 uint64_t
调用;所以问题是 reinterpret_cast
?我不明白为什么...
我的推测是关于 a
或 b
附近的内存块,因此 reinterpret_cast
的结果是原始 的 50% code>a
或 b
,另外 50% 是随机的内存块。这就是 Actor 阵容的真正作用吗?
我已经尝试了多个版本的 reinterpret_cast
,即使使用指针,也没有成功。
最佳答案
reinterpret_cast
本质上告诉编译器忽略其所有类型安全并只接受您正在做的事情。
您是说您的引用不是对 32 位数字的引用,而是对 64 位数字的引用。这当然意味着(在每字节 8 位的系统中),可能包含任何数据的 4 个字节被读取为整数的一部分。您还有一个与大端系统相关的“可移植性”问题,特别是其中更重要的字节首先出现,因此即使其他字节恰好为零,也会产生不同的数字。
执行此操作的正确方法是 static_cast
并且不使用引用而是“按值传递”。
实际上,您完全可以在不进行任何转换的情况下编写 foo。
uint64_t foo( uint64_t a, uint64_t b ) { return a + b; }
而且您可以使用 32 位数字调用它,而不必担心它们会溢出。 (尝试将它们相乘)。
关于c++ - 2 uint32_t 之间的数学运算返回 uint64_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269589/