当存储“字节数组”(斑点...)是它更好地使用的物品(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