2 uint32_t之间的数学运算返回一个uint64_t

时间:2013-11-28 15:17:42

标签: c++ unsigned-integer

我正在尝试使用像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?我不明白为什么...... 我的推测是关于ab附近的内存块,因此reinterpret_cast的结果是原ab的50%另外50%是一块随机的内存。我知道这个演员是如何运作的吗?

我已经尝试了几个版本的reinterpret_cast,即使有指针,也没有运气。

2 个答案:

答案 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_tuint_fast32_t,以较为合适的方式,而不是坚持可能不存在的确切尺寸。