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
和+
运算符。
CCD_ 4运算符在它所在的位置应该是好的,因为它正被2uint64_t
调用;那么问题出在reinterpret_cast
?我不明白为什么。。。我的推测是关于a
或b
附近的内存块,因此reinterpret_cast
的结果是原始a
或b
的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_t
或uint_fast32_t
,以更合适的为准,而不是坚持使用可能不存在的确切大小。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- 使用C++中的模板和运算符重载执行矩阵运算
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- 在代码中返回3221225725以进行简单概率运算
- 对返回0数组的数组执行位"或"或"异或"运算
- 如何正确返回矩阵乘法运算的结果
- 2 uint32_t之间的数学运算返回uint64_t
- SSE内部函数导致正常浮点运算返回-1.#INV
- Qt 返回糟糕的数学运算
- 返回类型取决于算术运算的顺序.对吗?