2017-08-03 55 views
1

也許我沒有找到其他函數,但是所有處理字節順序的函數我都只接受無符號變量。我的問題是爲什麼(或者是否存在處理字節順序和接受簽名變量的函數)?功能僅處理無符號值的字節順序的函數

名單我發現:herehere

可能的解決方案是使用這些macro?宏和以上功能有什麼區別?

+0

簽名是實現定義的,並且帶符號的整數不應該用於存儲位的映射。不過,如果你需要這樣做是因爲某個特定的原因,爲什麼不先把'int'轉換成它的'unsigned'等價的呢? –

+0

由於您正在討論實現,因此將位轉換爲無符號符號(某種類型的二進制方式)可以改變字節順序並將其轉換回來。 –

+0

@underscore_d是的,簽名是實現定義的,但是字節序也是如此。我認爲可以假設OP是指特定的實現。 –

回答

2

由於字節順序是實現定義,它是安全的假設,你在談論的實現,而不是C標準。看看你發送的鏈接,我想你是指Linux和GNU C編譯器。

然後在這個實現下,首先輸入雙關字signed intunsigned int,然後改變字節順序,然後鍵入回車。

以下是這樣做

union signed_unsigned { 
    signed long a; 
    unsinged long b;  
} converter; 


signed long to_convert = .... //whatever value 

converter.a = to_convert; 
converter.b = htonl(converted.b); 
to_convert = converter.a; 

,你認爲合適,您可以製作成宏或功能的方法之一。

正如@underscore_d所建議的那樣,使用指針強制類型轉換的另一種方法是雙擊一個signed longunsigned long(和後面)。這在C和C++中都是有效的(儘管在C++中你應該使用reinterpret_cast而不是C風格的指針轉換)。

您可以通過以下方式實現相同。

signed long to_convert = .... //whatever value 
unsigned long temp = *(unsinged long*)&to_convert; 
temp = htonl(temp); 
to_convert = *(signed long*)&temp; 
+0

如果有人在這裏登陸並希望在C++中使用它,請注意,只能通過「union」進行類型雙擊(儘管可能是陷印),而不是C++,而重新解釋爲相應的未登錄類型將工作於兩者(因爲別名規則允許)。 –

+0

我也會將指針添加到答案中。 –

+0

是的,它在Linux上與gcc編譯器。感謝這些答案。 –