因爲這不是reinterpret_cast
的用途。使用reinterpret_cast
的所有允許的轉換都涉及指針或引用,但整數或枚舉類型可以是reinterpret_cast
。這全部在標準[expr.reinterpret.cast]
中定義。
我不能確定你想在這裏實現什麼,但如果你想randomIntNumber
具有相同的價值randomUintNumber
,然後做
const int64_t randomIntNumber = randomUintNumber;
如果在編譯器警告的結果,或者如果你只是想更加明確,那麼:
const int64_t randomIntNumber = static_cast<int64_t>(randomUintNumber);
投的結果具有相同的值作爲輸入,如果randomUintNumber
小於2 。否則結果是實現定義的,但我期望所有已知的具有int64_t
的實現都將它定義爲做明顯的事情:結果等效於輸入模2 。
如果你想randomIntNumber
具有相同的位模式爲randomUintNumber
,那麼你可以這樣做:
int64_t tmp;
std::memcpy(&tmp, &randomUintNumber, sizeof(tmp));
const int64_t randomIntNumber = tmp;
由於int64_t
保證使用二進制補碼錶示,你會希望那該實現定義static_cast
與uint64_t
的超出範圍的值具有相同的結果。但在標準AFAIK中實際上並未得到保證。
即使randomUintNumber
是編譯時常量,不幸的是這裏的randomIntNumber
是而不是的編譯時常量。但是,那麼「隨機」是一個編譯時常量? ;-)
如果您需要解決的是,和你不信任的實施是明智的有關轉換超出範圍的無符號值符號類型,則這樣的事:
const int64_t randomIntNumber =
randomUintNumber <= INT64_MAX ?
(int64_t) randomUintNumber :
(int64_t) (randomUintNumber - INT64_MAX - 1) + INT64_MIN;
現在,我贊成在可能的情況下編寫真正可移植的代碼,但即使如此,我認爲這也偏執於偏執狂。
順便說一句,你也許會這樣寫:
const int64_t randomIntNumber = reinterpret_cast<int64_t&>(randomUintNumber);
或等價:
const int64_t randomIntNumber = *reinterpret_cast<int64_t*>(&randomUintNumber);
這倒不保證工作,因爲儘管他們存在int64_t
和uint64_t
保證是有符號類型和相同大小的無符號類型,它們實際上並不保證是標準整數類型的有符號和無符號版本。因此,無論此代碼是否違反嚴格的別名,它都是特定於實現的。違反嚴格別名的代碼具有未定義的行爲。下面確實不違反嚴格別名,並確定規定,在randomUintNumber
位模式是long long
值的有效表示:
unsigned long long x = 0;
const long long y = reinterpret_cast<long long &>(x);
因此,對實現中int64_t
和uint64_t
是long long
和unsigned long long
的typedef ,那我的reinterpret_cast
就OK了。就像實現定義的將超出範圍的值轉換爲帶符號的類型一樣,您希望期望實現要做的明智事情是使它們對應於signed/unsigned類型。所以就像static_cast
和隱式轉換一樣,您希望它可以在任何明智的實現中工作,但實際上並未得到保證。
如果你可以列出你得到的錯誤,我們可以更容易地說_why_它不能編譯。 –
@JoachimPileborg:我的不好,擴大了這個問題。 –