当存储“字节数组”(blob ...)时,最好使用char
或unsigned char
作为项目(unsigned char
a.k.a。uint8_t
)吗? (标准说两者的sizeof
恰好是1字节。)
一点都重要吗?或者一个比另一个更方便或更普遍?也许,像Boost这样的库会用什么?
答案 0 :(得分:11)
如果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
类型的对象占用的unsigned char
T
个对象的序列,N
等于sizeof(T)
。
答案 1 :(得分:1)
理论上,C ++中字节的大小取决于编译器设置和目标平台,但保证至少为8位,这就解释了为什么sizeof(uint8_t)
必须为1。
更准确地说,标准对此有何看法
§1.71
C ++内存模型中的基本存储单元是字节。一个 byte至少足以包含basic的任何成员 执行字符集(2.3)和8位代码单元 Unicode UTF-8编码形式,由一个连续的序列组成 位数,其数量是实现定义的。至少 有效位称为低位;最重要的一点 被称为高阶位。 C ++程序可用的内存 由一个或多个连续字节序列组成。每个字节都有 一个独特的地址。
因此,如果您正在处理字节不是8位的特殊硬件,那么它可能会产生实际差异。否则,我会说这是一个品味问题,你想通过选择类型来传达什么信息。
答案 2 :(得分:0)
没有实际的区别,尽管从可读性的角度来看,如果类型为unsigned char
暗示值为0..255,则更为清楚。