C++ int8_t vs char;哪一个是最好的?

C++ int8_t vs char;哪一个是最好的?,c++,c,char,C++,C,Char,我知道这两种类型都不同(signed char和char),但是我的公司编码指南规定使用int8\t而不是char 所以,我想知道,为什么我必须使用int8\t而不是char类型。是否有使用int8\u t的最佳实践?int8\u t由C99标准指定为正好八位宽,并与其他C99保证宽度类型相匹配。您应该在新代码中使用它,因为您需要一个精确的8位有符号整数。(不过,请看一下int\u least8\u t和int\u fast8\u t) char仍然是单字节字符串的首选元素类型,就像wchar\

我知道这两种类型都不同(
signed char
char
),但是我的公司编码指南规定使用
int8\t
而不是
char


所以,我想知道,为什么我必须使用
int8\t
而不是
char
类型。是否有使用
int8\u t
的最佳实践?

int8\u t
由C99标准指定为正好八位宽,并与其他C99保证宽度类型相匹配。您应该在新代码中使用它,因为您需要一个精确的8位有符号整数。(不过,请看一下
int\u least8\u t
int\u fast8\u t


char
仍然是单字节字符串的首选元素类型,就像
wchar\u t
应该是宽字符串的首选元素类型一样。

它们只是提供了不同的保证:

char
保证存在,宽度至少为8位,并且能够表示-127和127(如果有符号)之间或0和255(如果无符号)之间的所有整数

int8\u t
不保证存在(是的,有些平台上没有),但如果它存在,则保证为不带填充位的8位2补有符号整数类型;因此,它能够表示-128和127之间的所有整数,而不是其他整数


你应该什么时候用哪个?当类型所做的保证符合您的要求时。但是,值得注意的是,标准库的大部分都需要
char*
参数,因此避免使用
char
似乎完全是短视的,除非有人深思熟虑地决定避免使用这些库函数。

在某些情况下使用
int8_t
是非常好的,特别是当类型用于需要有符号8位值的计算时。涉及严格大小数据的计算[例如,外部要求将结果定义为正好8位](我在上面的评论中使用了像素颜色级别,但这实际上是
uint8\u t
,因为负像素颜色通常不存在-可能除了在YUV类型的颜色空间中)

类型
int8\t
不应用于替换字符串中的
char
。这可能会导致编译器错误(或警告,但我们也不想处理来自编译器的警告)。例如:

int8_t *x = "Hello, World!\n";

printf(x);
可能在编译器A上编译得很好,但在编译器B上混合有符号和无符号字符值时会给出错误或警告。或者如果
int8\t
甚至没有使用
char
类型。那就像期待一样

int *ptr = "Foo";
要在现代编译器中编译

换句话说,如果使用8位数据进行计算,则应使用
int8\t
而不是
char
。用
int8\t
大量替换所有
char
是不正确的,因为它们远不能保证相同

如果需要对字符串/文本/etc使用
char
,并且由于某种原因
char
过于模糊(可以是有符号的,也可以是无符号的,等等),则使用gn
typedef char mychar或类似的东西。(可能会找到比mychar更好的名称)


编辑:我应该指出,不管你是否同意这一点,我认为直接走到公司负责这一“原则”的人跟前,指着上面的帖子说“我认为你错了”是相当愚蠢的。试着理解动机是什么。它可能有更多的含义。

int8\u t
仅适用于要求有符号整数类型的代码,该类型的宽度正好为8位,如果没有此类类型,则不应编译。这样的要求远比关于
int8\t
的问题数量要少,而且它的兄弟们也指出了这一点。对大小的大多数要求是该类型至少具有特定位数<如果您至少需要8位,code>signed char
可以正常工作
int_至少8_t
也能工作。

如果我没记错的话,
char
不能保证正好是8位,在大多数现代系统上正好是这样。int8_t是独立于平台的,请参阅编译器中的stdint.h文件。@JoachimPileborg保证
char
的长度是一个字节。因此,
char
中的位的计数取决于特定系统的字节中的位的计数。@suspectus:pedanticly,对于定义它的任何平台。有些平台不支持8位类型。你不应该问你公司的其他人这些指导原则背后的理由是什么吗?谁保证2的互补性?请参考?7.20.1.1精确宽度整数类型,第1段:“typedef name intN\t指定一个有符号整数类型,宽度为N,无填充位,2的补码表示。”(强调我)。@GrijeshChauhan:是的,在C中,“字节”定义为“字符大小”,而
char
被定义为最小的可寻址内存单元。存在最小可寻址内存单元为16位、24位甚至32位的体系结构(主要是DSP)。如果您的公司告诉您使用
int8\t
来处理实际上是
char
值的内容(例如字符串),则可以。如果使用
int8\u t
是因为需要一个小整数来执行计算(例如像素颜色值),那么
int8\u t
是非常正确的做法。请注意,尽管使用
int8\u t*x=“Hello,World!\n”可能编译得很好;printf(x)有符号字符
是1的补码);它有