2012-12-11 151 views
9

當存儲「字節數組」(斑點...)是它更好地使用的物品(unsigned char又名uint8_tcharunsigned char? (標準說,兩者的sizeof正好是1字節。)字符VS無符號字符的字節數組

它有什麼關係嗎?或者一個比另一個更方便或更普遍?也許,像Boost這樣的庫可以使用?

+2

@nightcracker也許,你能指出重複嗎? – Cartesius00

+0

Dupe with https://stackoverflow.com/questions/653336/ – kebs

回答

10

如果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)

+0

哦,確實很棒。 +1 – Cartesius00

1

從理論上講,在C++中的一個字節的大小是依賴於編譯器的設置和目標平臺上,但它被保證是至少8位,這可以解釋爲什麼sizeof(uint8_t)需要爲1.

這裏的更確切地說什麼標準有什麼看法

§1.71

在C++內存模型的基本存儲單元是字節。一個 字節至少大到足以包含基本的執行字符集(2.3)的任何成員和Unicode編碼格式的UTF-8編碼格式的8位代碼單元,並且由位的連續序列 組成,其中的數量是實現定義的。最低有效位稱爲低位;最高有效位 被稱爲高位。可用於C++程序 的內存由一個或多個連續字節序列組成。每個字節都有 一個唯一的地址。

所以,如果你是在一些特殊的硬件,其中字節不是8位的工作,它可能帶來實質性變化。否則,我會說這是一個味道問題,你想通過類型的選擇來溝通什麼信息。

0

沒有實際區別,儘管從可讀性的角度來看,如果類型爲unsigned char意味着值爲0..255,則更清楚。

0

可能對斑點使用有符號值的其他問題之一是該值將取決於符號表示,這不是標準的一部分。所以,調用未定義的行爲更容易。

例如...

signed char x = 0x80; 
int y = 0xffff00ff; 

y |= (x << 8); // UB 

實際的算術值也將嚴格取決於兩個互補,這可能給一些人以驚喜。明確使用unsigned可避免這些問題。