16

我知道两者都是不同的类型 ( signed charand char),但是我公司的编码指南指定使用int8_t而不是char.

所以,我想知道,为什么我必须使用int8_t而不是char类型。有什么最佳实践可以使用int8_t吗?

4

4 回答 4

18

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

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

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

printf(x);

可能在编译器 A 上编译得很好,但在编译器 B 上混合有符号和无符号字符值时会给出错误或警告。或者int8_t甚至没有使用char类型。这就像期待

int *ptr = "Foo";

在现代编译器中编译...

换句话说,如果您使用 8 位数据进行计算,则int8_t应该使用它来代替。char将全部全部替换为 是不正确charint8_t,因为它们远不能保证是相同的。

如果需要使用char字符串/文本/等,并且由于某种原因char过于模糊(可以签名或未签名等),typedef char mychar;则应使用 ussign 或类似的东西。(可能会找到比 ! 更好的名字mychar!)

编辑:我应该指出,无论你是否同意这一点,我认为简单地走到公司负责这一“原则”的人面前,指着 SO 上的一个帖子说“我认为你错了”。尝试了解动机是什么。它可能比表面上看到的更多。

于 2013-07-19T11:36:21.493 回答
14

他们只是做出不同的保证:

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

int8_t不保证存在(是的,有些平台不存在),但如果存在,则保证为 8 位二进制补码有符号整数类型,没有填充位;因此它能够表示 -128 到 127 之间的所有整数,仅此而已。

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

于 2013-07-19T11:05:14.700 回答
4

int8_t适用于需要正好为8 位宽的有符号整数类型的代码,如果没有此类类型,则不应编译。这样的要求比关于它的问题的数量要少得多,int8_t而且它的弟兄们指出。对大小的大多数要求是该类型至少具有特定数量的位。signed char如果您需要至少 8 位,则可以正常工作;int_least8_t也有效。

于 2013-07-19T12:20:39.560 回答
1

int8_tC99 标准将其指定为正好 8 位宽,并且适合其他 C99 保证宽度类型。您应该在需要精确 8 位有符号整数的新代码中使用它。int_least8_t(不过,也请看一下int_fast8_t。)

char仍然首选作为单字节字符串的元素类型,就像wchar_t应该首选作为宽字符串的元素类型一样。

于 2013-07-19T10:52:15.523 回答