我有一个便于编码/解码原始内存的类。我最终存储一个void
指针指向内存和被引用的字节数。我担心混叠问题以及位移操作以使编码正确。从本质上讲,对于WHAT_TYPE
,我应该使用char
,unsigned char
,int8_t
,uint8_t
,int_fast8_t
,uint_fast8_t
,{{1 },或int_least8_t
?规范中是否有明确的答案?
uint_least8_t
答案 0 :(得分:10)
在C ++ 17中:std::byte
。这种类型是专门为此创建的,以传达所有正确的语义含义。此外,它具有您需要在原始数据上使用的所有运算符(例如示例中的<<
),但没有您不需要的运算符。
在C ++ 17之前:unsigned char
。该标准将对象表示定义为unsigned char
的序列,因此它只是一个很好的类型。此外,作为Mooing Duck rightly suggests,使用unsigned char*
可以防止因错误地使用引用原始字节的char*
而导致的许多错误,就好像它是一个字符串并将其传递给像{{1}这样的函数}}。
如果您确实无法使用strlen
,则应使用unsigned char
。 char
和unsigned char
都是允许别名的类型,因此要么优先于任何其他整数类型。