我的问题可能会让你感到困惑,我知道两者都是不同的类型(signed char和char),但我的公司编码指南指定使用int8_t而不是char.
所以,我想知道,为什么我必须使用int8_t而不是char类型.有没有最好的做法int8_t?
Mat*_*son 15
在int8_t某些情况下使用非常好 - 特别是当类型用于需要带符号的8位值的计算时.计算涉及严格大小的数据[例如,由外部要求定义为结果中的正好8位](我在上面的注释中使用了像素颜色级别,但实际上是uint8_t,因为负像素颜色通常不存在 - 除非可能在YUV型colourspace).
该类型int8_t不应该用作char字符串的替换.这可能导致编译器错误(或警告,但我们真的不想处理来自编译器的警告).例如:
int8_t *x = "Hello, World!\n";
printf(x);
Run Code Online (Sandbox Code Playgroud)
可能在编译器A上编译正常,但是在编译器B上混合有符号和无符号字符值时会给出错误或警告.或者如果int8_t甚至不使用char类型.这就像期待一样
int *ptr = "Foo";
Run Code Online (Sandbox Code Playgroud)
在现代编译器中编译......
换句话说,如果您使用8位数据进行计算,int8_t应该使用它代替char.这是不正确的批发更换所有char有int8_t,因为他们远离保证是相同的.
如果需要使用char字符串/文本/等,并且由于某种原因char太模糊(可以是签名或未签名等),那么typedef char mychar;应该使用usign 或类似的东西.(可能找到一个更好的名字mychar!)
编辑:我应该指出,无论你是否同意这一点,我认为简单地走向公司负责这个"原则"的人,指向SO的帖子并说"我"是相当愚蠢的.认为你错了".试着了解动机是什么.可能会有更多的东西比满足眼睛.
Ste*_*non 14
他们只是做出不同的保证:
char 保证存在,至少为8位宽,并且能够表示-127和127之间的所有整数(如果有符号)或0到255之间(如果是无符号).
int8_t不保证存在(是的,它有不存在的平台),但如果它存在,则保证8位二进制补码有符号整数类型,没有填充位; 因此,它能够表示-128和127之间的所有整数,而不是其他任何整数.
你什么时候应该使用哪个?当类型的保证符合您的要求时.然而,值得注意的是,标准库的大部分需要char *参数,因此char除非有人故意决定避免使用这些库函数,否则完全避免看似短视.