int8_t vs char; 哪个最好?

sok*_*kid 12 c c++ char

我的问题可能会让你感到困惑,我知道两者都是不同的类型(signed charchar),但我的公司编码指南指定使用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.这是不正确的批发更换所有charint8_t,因为他们远离保证是相同的.

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

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

  • 我会对你的第二句话提出异议。首先,由于积分提升,所有计算都将在“int”或更大的值中进行。因此,您无疑是指必须在尽可能小的空间中存储小的有符号值。为此,“signed char”可能更可取。您应该在代码中看到“int8_t”的唯一时间是当类型必须与某些外部协议或硬件匹配时。(像素可能应该是“uint24_t”,每种颜色 8 位,但这通常不存在。) (2认同)
  • 后来:如果 char 是 16 位,那么 int8_t 将不存在。它必须是可寻址类型(不是位字段),并且“char”必须是最小的可寻址类型(当然,C/C++ 实现中支持:某些机器,例如 VAX,支持寻址单个位)。 (2认同)

Ste*_*non 14

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

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

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

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

  • 7.20.1.1精确宽度整数类型,第1段:"typedef名称intN_t指定有符号整数类型,宽度为N,无填充位,**和二进制补码表示**."(强调我的). (7认同)