如何对char类型进行安全算术运算

时间:2018-01-04 13:51:11

标签: c string char

在普通C中,char类型是至少8位宽的类型,具有实现定义的签名。

正如When to use the plain char type in C问题的答案所示,如果您的数据类型是逐个字符串并且行为类似于普通C字符串,则应使用此类型,例如允许使用{{1}标准库中的函数。

但是,您可能需要对此类值进行算术运算。一个例子可能是UTF-8数据,您必须自己编写某种类型的处理器或显示例程(目标上没有适当的库解决方案)。

如何以最安全,最便携的方式处理这种情况?

1 个答案:

答案 0 :(得分:0)

对字符值进行操作的一种非常安全的方法可能是使用unsigned char类型并立即将它们转换为表达式中的unsigned(例如,写(unsigned) a - (unsigned) b而不是a-b })。

如果在算术表达式中使用字符类型,即使unsigned char,它也会被提升为int 1 ,并且int值的算术运算是在C中没有完全指定(特别是,溢出时的行为是未定义的)。立即将每个对象转换为unsigned将有效地回避这一点,从而对无符号值进行算术运算,这是更完全定义的。

这不是一个完美的解决方案。它将导致繁琐的代码,包含许多(unsigned)强制转换。而且,当然,定义行为并不意味着你总会获得所需的行为 - 人们仍然可以编写表达式,在不需要时包装(而不是溢出)。没有办法消除所有人为错误。

脚注

1 在其他地方的讨论中,在charint的深奥C实现中可能有相同的大小,在这种情况下unsigned char将被提升为unsigned int。出于所有实际目的,您可以忽略这一点。