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

标签 c++ unsigned-integer

我正在尝试使用像这样的接口(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 ?我不明白为什么... 我的推测是关于 ab 附近的内存块,因此 reinterpret_cast 的结果是原始 的 50% code>ab ,另外 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/

相关文章:

带有引用参数的 C++ 模板隐式实例化

c++ - 线程池适合生产吗?如果没有,是否有任何替代库?

numbers - Java 8 无符号整数加法和潜在溢出

c++ - 按位运算符和整数提升是怎么回事?

tuples - 玩转 Rust 的元组

c++ - 从 size_t 转换为 unsigned int

c++ - 为什么这个 OpenCV 矩阵的大小和值不正确?

c++ - 根据公共(public)元素组合成对的整数

c++ - 如何获取蓝牙HID设备的MAC地址?

nasm - 在 NASM 中声明变量