使用char
會引發一些問題 - 這完全取決於您想如何處理存儲在這些指針後面的值。
問題是,byte
通常被解釋爲無符號值。例如:UTF-8編碼。它產生字節序列,that can have different values, depending on encoded code point。如果我們使用帶符號的類型,則必須將值轉換爲無符號類型以便能夠正確檢查其值(大於U+007F
的代碼點總是轉換爲字節序列,其中所有字符都將符號位設置爲1)。
但是,char
是否被簽名是依賴於實現的。事實上,C++標準定義了三種不同的類型:
如果包括#include <limits.h>
,你可以看看CHAR_MIN
:
- 如果定義爲0,則
char
爲無符號
- 如果定義爲一些負面的值(通常爲-128),焦炭簽署
那麼,這一切意味着什麼?
您應該以某種方式存儲字節,這將允許您讀取/寫入它們的值而無需額外的檢查。你可能希望你的字節是一個無符號值,所以定義新的類型(如manyhigh-levellanguages做):
typedef unsigned char Byte;
,然後定義指針爲:,
Byte* data_pointer;
那麼如果你的函數期望'void *'或'Byte *',不需要做任何事情。但是,如果他們期望指向特定數字類型的指針(int
,float
等),則需要reinterpret_cast
這些指針。
你如何編碼有什麼指針背後,像接聽其不同的數值類型之一是這個指針指向? – Jojje
它應該主要取決於你的擔心,如果你喜歡把內存視爲不透明的,void *會阻止你意外解引用,如果你喜歡對內存進行編碼/解碼,可以使用語義數據類型,如char *','unsigned int *'等是首選。 –
@Jojje:這種情況發生的方式有很多種。例如,該字段發送給一個總是期望雙倍的函數。但通常這個問題不應該發揮作用。 – Michael