簡體   English   中英

Char與字節數組的unsigned char

[英]Char vs unsigned char for byte arrays

當存儲“字節數組”(blobs ...)時,最好使用charunsigned 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.

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