簡體   English   中英

C++ 將無符號轉換為有符號整數的可移植性

[英]C++ Converting unsigned to signed integer portability

我知道在 C 中,無符號到有符號整數的轉換是實現定義的,但是 C++ 是什么? 我想已經有人問過這個問題了,我搜索了但找不到。

我有一個對無符號整數進行運算並返回相關無符號整數的函數。 我通過轉換為類似於int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret;無符號來傳遞該函數一個有符號整數int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret; int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret; . 在 Visual Studio 中運行良好,但我想知道它的便攜性如何。

有沒有一種可移植的方式將無符號整數轉換為有符號整數? 是否可以通過環繞來反轉有符號整數轉換為無符號整數的方式? 謝謝

對於有符號-> 無符號轉換逆的便攜式版本,如何:

if ( ret <= INT_MAX )
    ret_as_signed = ret;
else
    ret_as_signed = -(int)(UINT_MAX - ret) - 1;

您可能可以使用<limits>的模板對此進行概括。

由於 C++20 最終擺脫了 1 的補碼和符號大小整數,有符號和無符號整數之間的轉換是明確定義和可逆的。 所有標准整數類型現在都是 2 的補碼,並且有符號和無符號之間的轉換不會改變表示中的任何位。

對於 C++20 之前的 C++ 版本,原始答案仍然適用。 我將它作為歷史遺跡留下。


將無符號整數轉換為有符號整數,其中無符號值超出有符號類型的范圍是實現定義的 您不能指望能夠將負整數往返為無符號然后返回到有符號。 [1]

C++ 標准,[conv.integral],第 4.7/3 節:

如果目標類型是有符號的,如果它可以在目標類型(和位域寬度)中表示,則該值不變; 否則,該值是實現定義的。

[1] 似乎它會起作用,但不能保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM