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

math operation between 2 uint32_t returning an uint64_t

本文关键字:运算 返回 uint64 uint32 之间      更新时间:2023-10-16

我正试图用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+运算符。

CCD_ 4运算符在它所在的位置应该是好的,因为它正被2uint64_t调用;那么问题出在reinterpret_cast?我不明白为什么。。。我的推测是关于ab附近的内存块,因此reinterpret_cast的结果是原始ab的50%,而另50%是随机内存块。我知道这个演员阵容是怎么运作的?

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

reinterpret_cast本质上告诉编译器忽略其所有类型安全性,只接受您正在做的事情。

您的引用不是指32位数字,而是指64位数字。当然,这意味着(在每字节8位的系统中),可能包含任何数据的4个字节将作为整数的一部分读取。您还有一个与big-endian系统相关的"可移植性"问题,特别是当更重要的字节首先出现时,因此即使其他字节恰好为零,也会产生不同的数字。

执行此操作的正确方法是static_cast,不要使用引用,而是"按值传递"。

实际上,您可以在不进行任何强制转换的情况下编写foo。

uint64_t foo( uint64_t a, uint64_t b ) { return a + b; }

您可以用32位数字调用它,而不用担心它们是否溢出。(把它们相乘试试)。

你太努力了。传递值并使用static_cast。此外,使用uint_least32_tuint_fast32_t,以更合适的为准,而不是坚持使用可能不存在的确切大小。