[英]Char vs unsigned char for byte arrays
當存儲“字節數組”(blobs ...)時,最好使用char
或unsigned char
作為項目( unsigned char
aka uint8_t
)? (標准說sizeof
兩者恰恰是1個字節)。
它有關系嗎? 或者一個比另一個更方便或更普遍? 也許,像Boost這樣的圖書館會用到什么?
如果char
已簽名,則對具有高位設置的字節值執行算術運算將在提升到int
時導致符號擴展; 所以,例如:
char c = '\xf0';
int res = (c << 24) | (c << 16) | (c << 8) | c;
將給出0xfffffff0
而不是0xf0f0f0f0
。 通過使用0xff
屏蔽可以避免這種情況。
如果您與使用它而不是unsigned char
庫連接,那么char
可能仍然是首選。
請注意,從char *
到/來自unsigned char *
的轉換始終是安全的(3.9p2)。 支持unsigned char
哲學理由是標准中的3.9p4支持它,至少對於表示可以保存對象的內存表示的字節數組:
類型的對象的對象表示
T
是序列N
unsigned char
由類型的對象占據對象T
,其中N
等於sizeof(T)
。
從理論上講,C ++中字節的大小取決於編譯器設置和目標平台,但保證至少為8位,這就解釋了為什么sizeof(uint8_t)
必須為1。
更准確地說,標准對此有何看法
§1.71
C ++內存模型中的基本存儲單元是字節。 一個字節至少足以包含基本執行字符集(2.3)的任何成員和Unicode UTF-8編碼形式的八位代碼單元,並由連續的位序列組成,其數量為實現定義。 最低有效位稱為低位; 最重要的位稱為高位。 C ++程序可用的內存由一個或多個連續字節序列組成。 每個字節都有一個唯一的地址。
因此,如果您正在使用一些字節不是8位的特殊硬件,它可能會產生實際差異。 否則,我會說這是一個品味問題以及您希望通過類型選擇進行溝通的信息。
盡管從可讀性的角度來看,如果類型是unsigned char
表示值為0..255,則更加清楚。
可能對blob使用帶符號值的其他問題之一是該值將取決於符號表示,而不是標准的一部分。 因此,調用未定義的行為更容易。
例如...
signed char x = 0x80;
int y = 0xffff00ff;
y |= (x << 8); // UB
實際的算術值也嚴格依賴於兩個補碼,這可能會給一些人帶來驚喜。 使用unsigned明確避免了這些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.