我擔心我可能會丟失一些微不足道的東西,但是如果您希望保留原始的無符號值,似乎沒有實際的安全方式來轉換爲簽名類型/從一個簽名類型。沒有兼容的方式來轉換相同大小的簽名/無符號
在reinterpret_cast上,5.2.10沒有列出整數轉換爲整數,因此沒有定義(並且static_cast沒有定義額外的轉換)。關於積分轉換4.7.3基本上說大的無符號轉換將被實現定義(因此不可移植)。
這似乎是有限制的,因爲我們知道,例如,在任何硬件上,uint64_t
應該可以安全地轉換爲int64_t
,並且返回時沒有值的變化。再加上關於標準佈局類型的規則實際上保證了安全轉換,如果我們在memcpy
這兩種類型之間而不是分配。
我正確嗎?爲什麼在整數類型之間不能有reinterpret_cast
足夠大小的合法理由?
澄清:絕對無符號的簽名版本不保證值,但它只是我在考慮往返(無符號=>簽訂=>無符號)
UPDATE:仔細查看答案並交叉檢查標準,我相信memcpy
實際上並不能保證工作,因爲它沒有聲明這兩種類型是佈局兼容的,並且都不是char類型。進一步更新,挖掘到C標準這個memcpy應該工作,因爲目標的大小足夠大,它複製字節。
答案:似乎有沒有技術理由的reinterpret_cast是不允許進行這種轉換。對於這些固定大小的整數類型,一個memcpy
保證工作,事實上,只要中間可以表示所有的位模式,任何中間類型都可以使用(因爲可能存在陷阱模式,float可能是危險的)。一般來說,你不能在任何標準佈局類型之間使用memcpy,它們必須是兼容的或char類型的。這裏的整數是特殊的,因爲它們有額外的保證。
我認爲你總是可以這樣做,畢竟reinterpret_cast只是告訴編譯器如何解釋一個內存位置而不改變位置值。在任何硬件上「 – 2012-02-27 15:27:01
」。恰恰是這一點。也許在任何你可以使用的硬件上,但C++並非設計用於學院的理由來支持除了2nd補充以外的其他一些東西,而是因爲實際上有這樣的硬件。並且(u)intXX_t類型只需要在計算「as-if」時表現爲「二進制補碼」,但並不要求硬件必須是。 – PlasmaHH 2012-02-27 15:30:59
@PlasmaHH,我的觀點是'uint64_t','int64_t'是確切的大小(如果在硬件上支持),因此'memcpy'保證轉換(通過標準佈局類型的規則)。我不關心2的補碼,我想要一個來回轉換。 – 2012-02-27 15:33:45