Char与字节数组的unsigned char

时间:2012-12-11 11:52:36

标签: c++ gcc c++11

当存储“字节数组”(blob ...)时,最好使用charunsigned char作为项目(unsigned char a.k.a。uint8_t)吗? (标准说两者的sizeof恰好是1字节。)

一点都重要吗?或者一个比另一个更方便或更普遍?也许,像Boost这样的库会用什么?

3 个答案:

答案 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,则更为清楚。