簡體   English   中英

安全地在unsigned和signed int之間轉換

[英]Converting between unsigned and signed int safely

我在客戶端和服務器之間有一個接口,客戶端在該接口上發送(1)一個無符號值,和(2)一個標志,該值指示值是有符號/無符號的。 然后,服務器會將靜態無符號值強制轉換為適當的類型。

后來我發現這是實現定義的行為,我一直在閱讀它,但是似乎找不到完全安全的合適解決方案? 我已經讀過有關類型校正,指針轉換和memcpy的內容。

會簡單地使用聯合類型嗎? 一個包含有符號和無符號int以及有符號/無符號標志的UnionType。 對於帶符號的值,客戶端設置聯合的帶符號的部分,服務器讀取帶簽名的部分。 相同的未簽名部分。 還是我完全誤會了什么?

附帶問題:如何得知特定情況下的特定行為,例如PPC上的windriver diab? 我對如何找到這樣的文檔有些迷惑。

轉換unsignedint只是形式上有問題。 實際上,所有現存平台都使用二進制補碼表示形式,其中unsignedintintunsigned (在形式上明確定義)完全相反。 因此沒有問題。


參閱Wikipedia在UNIVAC上的文章,以一個使用補碼表示的平台為例,例如12位和36位位字。

聯合解決方案將要求您讓客戶端和服務器都使用相同的表示形式,這不是一個好主意。 (例如,大尾數系統和小尾數系統都是常見的)。

您應該以某種方式序列化值。 但是,您只需針對每種類型分別執行此操作。

例如(偽代碼)

void send_signed(int32_t x)
{
    send(1, "s");
    send(sizeof x, serialized x);
}

void send_unsigned(uint32_t x)
{
     send(1, "u");
     send(sizeof x, serialized x);
}

並在接收器上; 您首先閱讀該類型。 如果它是“ s”,則您要對一個有符號的int進行反序列化,以此類推。 如果它是“ u”,則您將未簽名的int序列化(轉換為其他變量)並對其進行處理。

暫無
暫無

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

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