int8_t vs char; 哪个是最好的?
我的问题可能会让你感到困惑,我知道两者都是不同的类型( signed char
和char
),但我的公司编码指南指定使用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_t
和int_fast8_t
。)
char
仍然是首选的单字节字符串的元素类型,正如wchar_t
应该首选作为宽字符串的元素类型。