也許我沒有找到其他函數,但是所有處理字節順序的函數我都只接受無符號變量。我的問題是爲什麼(或者是否存在處理字節順序和接受簽名變量的函數)?功能僅處理無符號值的字節順序的函數
可能的解決方案是使用這些macro?宏和以上功能有什麼區別?
也許我沒有找到其他函數,但是所有處理字節順序的函數我都只接受無符號變量。我的問題是爲什麼(或者是否存在處理字節順序和接受簽名變量的函數)?功能僅處理無符號值的字節順序的函數
可能的解決方案是使用這些macro?宏和以上功能有什麼區別?
由於字節順序是實現定義,它是安全的假設,你在談論的實現,而不是C標準。看看你發送的鏈接,我想你是指Linux和GNU C編譯器。
然後在這個實現下,首先輸入雙關字signed int
到unsigned 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 long
到unsigned 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;
如果有人在這裏登陸並希望在C++中使用它,請注意,只能通過「union」進行類型雙擊(儘管可能是陷印),而不是C++,而重新解釋爲相應的未登錄類型將工作於兩者(因爲別名規則允許)。 –
我也會將指針添加到答案中。 –
是的,它在Linux上與gcc編譯器。感謝這些答案。 –
簽名是實現定義的,並且帶符號的整數不應該用於存儲位的映射。不過,如果你需要這樣做是因爲某個特定的原因,爲什麼不先把'int'轉換成它的'unsigned'等價的呢? –
由於您正在討論實現,因此將位轉換爲無符號符號(某種類型的二進制方式)可以改變字節順序並將其轉換回來。 –
@underscore_d是的,簽名是實現定義的,但是字節序也是如此。我認爲可以假設OP是指特定的實現。 –