在普通C中,char
类型是至少8位宽的类型,具有实现定义的签名。
正如When to use the plain char type in C问题的答案所示,如果您的数据类型是逐个字符串并且行为类似于普通C字符串,则应使用此类型,例如允许使用{{1}标准库中的函数。
但是,您可能需要对此类值进行算术运算。一个例子可能是UTF-8数据,您必须自己编写某种类型的处理器或显示例程(目标上没有适当的库解决方案)。
如何以最安全,最便携的方式处理这种情况?
答案 0 :(得分:0)
对字符值进行操作的一种非常安全的方法可能是使用unsigned char
类型并立即将它们转换为表达式中的unsigned
(例如,写(unsigned) a - (unsigned) b
而不是a-b
})。
如果在算术表达式中使用字符类型,即使unsigned char
,它也会被提升为int
1 ,并且int
值的算术运算是在C中没有完全指定(特别是,溢出时的行为是未定义的)。立即将每个对象转换为unsigned
将有效地回避这一点,从而对无符号值进行算术运算,这是更完全定义的。
这不是一个完美的解决方案。它将导致繁琐的代码,包含许多(unsigned)
强制转换。而且,当然,定义行为并不意味着你总会获得所需的行为 - 人们仍然可以编写表达式,在不需要时包装(而不是溢出)。没有办法消除所有人为错误。
1 在其他地方的讨论中,在char
和int
的深奥C实现中可能有相同的大小,在这种情况下unsigned char
将被提升为unsigned int
。出于所有实际目的,您可以忽略这一点。