2012-12-11 105 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可避免这些问题。