簡體   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