int8_t vs char; 哪个是最好的?

我的问题可能会让你感到困惑,我知道两者都是不同的类型( signed charchar ),但我的公司编码指南指定使用int8_t而不是char

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

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

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

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

可以很好地编译编译器A,但是在编译器B上混合有符号和无符号字符值时会给出错误或警告。或者如果int8_t甚至不使用char类型。 这就像期待的那样

 int *ptr = "Foo"; 

在现代编译器中编译……

换句话说,如果使用8位数据进行caclulation, int8_t应该使用int8_t而不是char 。 用int8_t批量替换所有char是不正确的,因为它们远非保证是相同的。

如果需要对字符串/文本/等使用char ,并且由于某种原因, char太模糊(可以是有符号或无符号等),那么请使用typedef char mychar; 或者应该使用类似的东西。 (可能找到一个比mychar更好的名字!)

编辑:我应该指出,无论你是否同意这一点,我认为简单地走向公司负责这个“原则”的人,点上SO的post并说“我”是相当愚蠢的。认为你错了“。 试着了解动机是什么。 可能会有更多的东西比满足眼睛。

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

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

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

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

int8_t 适用于需要一个正好为 8位宽的有符号整数类型的代码,如果没有这种类型则不应编译。 这些要求比关于int8_t的问题的数量要少得多,而且他们的兄弟们表示。 对大小的大多数要求是该类型至少具有特定数量的位。 如果你需要至少8位, signed char工作得很好; int_least8_t也有效。

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

char仍然是首选的单字节字符串的元素类型,正如wchar_t应该首选作为宽字符串的元素类型。