在存储"字节数组"(二进制大对象...)时,使用
这是否重要?或者其中一个比另一个更方便或普遍?也许像Boost这样的库使用哪种类型?
char
还是unsigned char
(也称为uint8_t
)更好?(标准规定两者的sizeof
都恰好为1个字节。)这是否重要?或者其中一个比另一个更方便或普遍?也许像Boost这样的库使用哪种类型?
如果char
是有符号的,那么在将带有高位设置的字节值提升为int
时进行算术运算将导致符号扩展; 因此,例如:
char c = '\xf0';
int res = (c << 24) | (c << 16) | (c << 8) | c;
将会返回0xfffffff0
而不是0xf0f0f0f0
。可以通过使用掩码0xff
来避免这种情况。
如果你需要与使用char
的库进行接口交互,那么char
仍然可能更可取。
请注意,从char *
到unsigned char *
的转换始终是安全的(3.9p2)。支持unsigned char
的一个哲学原因是标准中的3.9p4,至少对于表示可能包含对象内存表示的字节数组而言:
类型为
T
的对象的对象表示是由类型为T
的对象占用的N
个unsigned char
对象序列,其中N
等于sizeof(T)
。
sizeof(uint8_t)
为1。另一个可能使用有符号值来处理 blob 的问题是它的值将取决于符号表示,而这并不是标准的一部分。因此,会更容易引起未定义行为。
例如...
signed char x = 0x80;
int y = 0xffff00ff;
y |= (x << 8); // UB
从实际效果来看并没有什么区别,但从可读性的角度来看,如果类型是unsigned char
,则意味着值为0..255,这可能更加清晰。