在纯 C 中,按照标准存在三种不同的“字符”类型:
- plain
char
其符号是实现定义的。 符号字符
。无符号字符
。
我们假设至少是 C99,其中 stdint.h
已经存在(因此您有 int8_t
和 uint8_t
类型作为推荐的替代方案有符号和无符号字符的显式宽度)。
目前对我来说,使用普通的 char
类型似乎只有在您需要连接标准库的函数(例如 printf
)时才真正有用(或必要) , 而在所有其他情况下,则应避免。使用 char
在实现上签名时可能会导致未定义的行为,并且出于任何原因您需要对此类数据进行任何运算。
使用适当类型的问题可能在处理例如 Unicode 文本(或任何使用 127 以上的值来表示字符的代码页)时最为明显,否则可以将其作为纯 C 字符串处理。然而,相关的 string.h
函数都接受 char
,如果这样的数据类型为 char
,那么在尝试解释它时就会出现问题,例如用于能够处理其编码的显示例程。
在这种情况下,最值得推荐的方法是什么?除此之外,是否有任何特殊原因可以推荐使用 char
而不是 stdint.h
的适当固定宽度类型?
最佳答案
char
type 用于字符和字符串。它是所有字符串处理函数所期望和返回的类型。 (*) 你真的不应该对 char
做算术运算,尤其不是签名会产生影响的那种。
unsigned char
是用于原始数据的类型。例如memcpy()
或 fread()
诠释他们的void *
参数作为 unsigned char
的数组.该标准保证任何类型也可以表示为 unsigned char
的数组。 .任何其他转换都可能是“信号”,即触发异常。 (ISO/IEC 9899:2011,第 6.2.6 节“类型表示”)。 (**)
signed char
是当您需要 char
的有符号整数时大小(用于算术)。
(*):<ctype.h>
中的字符处理函数对此有点古怪,因为它们迎合了 EOF(负),因此将字符值“强制”到 unsigned char
中。范围(ISO/IEC 9899:2011,第 7.4 节字符处理)。但是因为可以保证 char
可以转换为 unsigned char
并按照第 6.2.6 节返回而不丢失信息……你明白了。
当 char
有符号时会有所不同——比较功能类似于 strcmp()
-- 标准规定 char
被解释为 unsigned char
(ISO/IEC 9899:2011,第 7.24.4 节比较函数)。
(**):实际上,很难看出如何将原始数据转换为 char
。和返回信号可能是用 unsigned char
做的相同的信号不会发出信号。但是unsigned char
是标准部分所说的。 ;-)
关于c - 何时在 C 中使用普通 char 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091302/