當存儲「字節數組」(斑點...)是它更好地使用的物品(unsigned char
又名uint8_t
)char
或unsigned char
? (標準說,兩者的sizeof
正好是1字節。)字符VS無符號字符的字節數組
它有什麼關係嗎?或者一個比另一個更方便或更普遍?也許,像Boost這樣的庫可以使用?
當存儲「字節數組」(斑點...)是它更好地使用的物品(unsigned char
又名uint8_t
)char
或unsigned char
? (標準說,兩者的sizeof
正好是1字節。)字符VS無符號字符的字節數組
它有什麼關係嗎?或者一個比另一個更方便或更普遍?也許,像Boost這樣的庫可以使用?
如果char
有符號,那麼對高位設置的字節值執行算術運算會導致在向int
提升時出現符號擴展;因此,例如:
char c = '\xf0';
int res = (c << 24) | (c << 16) | (c << 8) | c;
會給0xfffffff0
,而不是0xf0f0f0f0
。這可以通過掩蓋0xff
來避免。
char
如果您使用它的庫而不是unsigned char
可能仍然更可取。
請注意,從char *
到/從unsigned char *
的劇組總是安全的(3.9p2)。的哲學原因有利於unsigned char
是在標準3.9p4有利於它,至少用於表示可容納對象的內存中表示字節的數組:
T
類型的對象的對象表示是序列其中N
等於sizeof(T)
。
哦,確實很棒。 +1 – Cartesius00
從理論上講,在C++中的一個字節的大小是依賴於編譯器的設置和目標平臺上,但它被保證是至少8位,這可以解釋爲什麼sizeof(uint8_t)
需要爲1.
這裏的更確切地說什麼標準有什麼看法
§1.71
在C++內存模型的基本存儲單元是字節。一個 字節至少大到足以包含基本的執行字符集(2.3)的任何成員和Unicode編碼格式的UTF-8編碼格式的8位代碼單元,並且由位的連續序列 組成,其中的數量是實現定義的。最低有效位稱爲低位;最高有效位 被稱爲高位。可用於C++程序 的內存由一個或多個連續字節序列組成。每個字節都有 一個唯一的地址。
所以,如果你是在一些特殊的硬件,其中字節不是8位的工作,它可能帶來實質性變化。否則,我會說這是一個味道問題,你想通過類型的選擇來溝通什麼信息。
沒有實際區別,儘管從可讀性的角度來看,如果類型爲unsigned char
意味着值爲0..255,則更清楚。
可能對斑點使用有符號值的其他問題之一是該值將取決於符號表示,這不是標準的一部分。所以,調用未定義的行爲更容易。
例如...
signed char x = 0x80;
int y = 0xffff00ff;
y |= (x << 8); // UB
實際的算術值也將嚴格取決於兩個互補,這可能給一些人以驚喜。明確使用unsigned可避免這些問題。
@nightcracker也許,你能指出重複嗎? – Cartesius00
Dupe with https://stackoverflow.com/questions/653336/ – kebs