我正在尝试使用像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
的结果是原a
或b
的50%另外50%是一块随机的内存。我知道这个演员是如何运作的吗?
我已经尝试了几个版本的reinterpret_cast
,即使有指针,也没有运气。
答案 0 :(得分:4)
reinterpret_cast
实质上告诉编译器忽略它的所有类型安全性,只接受你正在做的事情。
您说您的引用不是对32位数字的引用,而是对64位数字的引用。这当然意味着(在每字节8位系统中),可能包含任何数据的4个字节作为整数的一部分被读取。您还有一个与big-endian系统相关的“可移植性”问题,特别是首先出现更重要的字节,因此即使其他字节恰好为零,也会产生不同的数字。
执行此操作的正确方法是static_cast
,不使用引用,而是使用“按值传递”。
实际上,你可以设法写foo而不需要任何演员。
uint64_t foo( uint64_t a, uint64_t b ) { return a + b; }
你可以用32位数字来调用它,如果它们溢出就不用担心。 (尝试将它们相乘)。
答案 1 :(得分:1)
你太努力了。按值传递并使用static_cast
。另外,请使用uint_least32_t
或uint_fast32_t
,以较为合适的方式,而不是坚持可能不存在的确切尺寸。