[英]Char vs unsigned char for byte arrays
当存储“字节数组”(blobs ...)时,最好使用char
或unsigned char
作为项目( unsigned char
aka uint8_t
)? (标准说sizeof
两者恰恰是1个字节)。
它有关系吗? 或者一个比另一个更方便或更普遍? 也许,像Boost这样的图书馆会用到什么?
如果char
已签名,则对具有高位设置的字节值执行算术运算将在提升到int
时导致符号扩展; 所以,例如:
char c = '\xf0';
int res = (c << 24) | (c << 16) | (c << 8) | c;
将给出0xfffffff0
而不是0xf0f0f0f0
。 通过使用0xff
屏蔽可以避免这种情况。
如果您与使用它而不是unsigned char
库连接,那么char
可能仍然是首选。
请注意,从char *
到/来自unsigned char *
的转换始终是安全的(3.9p2)。 支持unsigned char
哲学理由是标准中的3.9p4支持它,至少对于表示可以保存对象的内存表示的字节数组:
类型的对象的对象表示
T
是序列N
unsigned char
由类型的对象占据对象T
,其中N
等于sizeof(T)
。
从理论上讲,C ++中字节的大小取决于编译器设置和目标平台,但保证至少为8位,这就解释了为什么sizeof(uint8_t)
必须为1。
更准确地说,标准对此有何看法
§1.71
C ++内存模型中的基本存储单元是字节。 一个字节至少足以包含基本执行字符集(2.3)的任何成员和Unicode UTF-8编码形式的八位代码单元,并由连续的位序列组成,其数量为实现定义。 最低有效位称为低位; 最重要的位称为高位。 C ++程序可用的内存由一个或多个连续字节序列组成。 每个字节都有一个唯一的地址。
因此,如果您正在使用一些字节不是8位的特殊硬件,它可能会产生实际差异。 否则,我会说这是一个品味问题以及您希望通过类型选择进行沟通的信息。
尽管从可读性的角度来看,如果类型是unsigned char
表示值为0..255,则更加清楚。
可能对blob使用带符号值的其他问题之一是该值将取决于符号表示,而不是标准的一部分。 因此,调用未定义的行为更容易。
例如...
signed char x = 0x80;
int y = 0xffff00ff;
y |= (x << 8); // UB
实际的算术值也严格依赖于两个补码,这可能会给一些人带来惊喜。 使用unsigned明确避免了这些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.