我知道这两者是不同的类型(signed char
和char
),但是我的公司编码指南指定使用int8_t
而不是char
。
所以,我想知道,为什么我必须使用int8_t
而不是char
类型。是否有使用int8_t
的最佳实践
发布于 2013-07-19 19:36:21
在某些情况下,int8_t
的使用是非常好的-特别是当该类型用于需要带符号的8位值的计算时。涉及严格大小的数据e.g. defined by external requirements to be exactly 8 bit in the result的计算。
不应将int8_t
类型用作for字符串中的char
的替代。这可能会导致编译器错误(或警告,但我们也不希望必须处理来自编译器的警告)。例如:
int8_t *x = "Hello, World!\n";
printf(x);
这就像是期待
int *ptr = "Foo";
要在现代编译器中编译...
换句话说,如果您使用8位数据进行计算,则应该使用int8_t
而不是char
。用int8_t
批量替换所有char
是不正确的,因为它们远不能保证是相同的。
如果需要对字符串/文本/等使用char
,并且由于某些原因char
太模糊(它可以是签名的或未签名的,等等),那么应该使用typedef char mychar;
或类似的东西。(也许可以找到一个比mychar
更好的名字!)
编辑:我应该指出,无论你是否同意这一点,我认为简单地走到公司负责这一“原则”的人面前,指着SO上的一篇帖子说“我认为你错了”,这是相当愚蠢的。试着理解动机是什么。这可能比表面看上去的更多。
发布于 2013-07-19 19:05:15
他们只是做了不同的保证:
char
保证存在,至少8位宽,并且能够表示介于-127和127 (如果有符号)或0到255 (如果没有符号)之间的所有整数。
int8_t
不能保证存在(是的,在某些平台上它不存在),但如果它存在,则保证它是一个没有填充位的8位二进制补码有符号整数类型;因此,它能够表示-128到127之间的所有整数,其他就不能表示了。
你应该在什么时候使用哪一个?当类型所作的保证符合您的要求时。然而,值得注意的是,标准库的很大一部分都需要char *
参数,因此完全避免使用char
似乎是目光短浅的,除非经过深思熟虑地决定避免使用这些库函数。
发布于 2013-07-19 20:20:40
int8_t
是only,适用于需要8位宽的有符号整数类型的代码,如果没有这种类型,则不应编译。这样的要求比关于int8_t
及其兄弟的问题数量要少得多。对大小的大多数要求是类型至少具有特定数量的比特。如果你至少需要8位,signed char
就能正常工作;int_least8_t
也能工作。
https://stackoverflow.com/questions/17744226
复制相似问题