我知道两者都是不同的类型 ( signed char
and char
),但是我公司的编码指南指定使用int8_t
而不是char
.
所以,我想知道,为什么我必须使用int8_t
而不是char
类型。有什么最佳实践可以使用int8_t
吗?
在某些情况下使用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
将全部全部替换为 是不正确char
的int8_t
,因为它们远不能保证是相同的。
如果需要使用char
字符串/文本/等,并且由于某种原因char
过于模糊(可以签名或未签名等),typedef char mychar;
则应使用 ussign 或类似的东西。(可能会找到比 ! 更好的名字mychar
!)
编辑:我应该指出,无论你是否同意这一点,我认为简单地走到公司负责这一“原则”的人面前,指着 SO 上的一个帖子说“我认为你错了”。尝试了解动机是什么。它可能比表面上看到的更多。
他们只是做出不同的保证:
char
保证存在,至少为 8 位宽,并且能够表示 -127 到 127 之间(如果有符号)或 0 到 255(如果无符号)之间的所有整数。
int8_t
不保证存在(是的,有些平台不存在),但如果存在,则保证为 8 位二进制补码有符号整数类型,没有填充位;因此它能够表示 -128 到 127 之间的所有整数,仅此而已。
什么时候应该使用哪个?当类型做出的保证符合您的要求时。然而,值得注意的是,标准库的大部分内容都需要char *
参数,因此char
完全避免似乎是短视的,除非有意决定避免使用这些库函数。
int8_t
仅适用于需要正好为8 位宽的有符号整数类型的代码,如果没有此类类型,则不应编译。这样的要求比关于它的问题的数量要少得多,int8_t
而且它的弟兄们指出。对大小的大多数要求是该类型至少具有特定数量的位。signed char
如果您需要至少 8 位,则可以正常工作;int_least8_t
也有效。
int8_t
C99 标准将其指定为正好 8 位宽,并且适合其他 C99 保证宽度类型。您应该在需要精确 8 位有符号整数的新代码中使用它。int_least8_t
(不过,也请看一下int_fast8_t
。)
char
仍然首选作为单字节字符串的元素类型,就像wchar_t
应该首选作为宽字符串的元素类型一样。