我的问题可能让您感到困惑,我知道两种类型都不同(signed char
和char
),但我的公司编码指南指定使用int8_t
代替char
所以,我想知道,为什么我必须使用int8_t
而不是char
类型。是否有使用int8_t
的最佳做法?
答案 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)
int8_t
正好是8位宽,并且适合其他C99保证宽度类型。您应该在需要精确8位有符号整数的新代码中使用它。 (不过,请查看int_least8_t
和int_fast8_t
。)
char
仍然是首选单字节字符串的元素类型,正如wchar_t
应该首选广泛字符串的元素类型。