int8_t vs char;哪个最好?

时间:2013-07-19 10:45:12

标签: c++ c char

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

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

4 个答案:

答案 0 :(得分:15)

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

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

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

printf(x);

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

int *ptr = "Foo";

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

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

如果需要将char用于字符串/文本/等,并且由于某些原因char太模糊(可以是签名或未签名等),那么请{{1应该使用类似的东西。 (可能找到比typedef char mychar;更好的名字!)

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

答案 1 :(得分:14)

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

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

C99标准指定的

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

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