繁体   English   中英

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

[英]math operation between 2 uint32_t returning an uint64_t

我正在尝试使用像这样的接口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%是随机的a记忆。 我这个演员表如何真正起作用?

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

reinterpret_cast本质上告诉编译器忽略其所有类型安全性,仅接受您正在执行的操作。

您是说您的引用不是对32位数字的引用,而是对64位数字的引用。 这当然意味着(在每字节8位系统中),可能包含任何数据的4个字节将作为整数的一部分被读取。 您还会遇到一个与“大端”系统有关的“可移植性”问题,尤其是在优先级更高的字节首先出现的情况下,即使其他字节碰巧为零,也会产生不同的数字。

您执行此操作的正确方法是static_cast ,不要使用引用,而应使用“传递值”。

实际上,您可以编写foo而无需进行任何强制转换。

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

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

你太努力了 按值传递并使用static_cast 另外,请使用uint_least32_tuint_fast32_t两者中较合适的一种,而不要坚持可能不存在的确切大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM