如何对char类型进行安全算术运算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对char类型进行安全算术运算相关的知识,希望对你有一定的参考价值。
在普通C中,char
类型是至少8位宽类型,具有实现定义的符号。
正如When to use the plain char type in C问题的答案所示,当你有一个按意图字符串的数据类型并且行为类似于普通的C字符串时,应该使用这种类型,允许使用标准库中的string.h
函数。
但是,可能存在需要对此类值进行算术运算的情况。一个例子可能是UTF-8数据,您必须自己编写某种类型的处理器或显示例程(目标上没有适当的库解决方案)。
如何以最安全,最便携的方式处理这种情况?
对字符值进行操作的一种很安全的方法可能是使用unsigned char
类型并立即将它们转换为表达式中的unsigned
(例如,写(unsigned) a - (unsigned) b
而不是a-b
)。
如果在算术表达式中使用字符类型,即使是unsigned char
,它也会被提升为int
1,并且在C中没有完全指定int
值的算术(特别是,溢出时的行为是未定义的)。立即将每个对象强制转换为unsigned
将有效地回避这一点,从而对无符号值进行算术运算,这是更完全定义的。
这不是一个完美的解决方案。它将导致繁琐的代码,有许多(unsigned)
演员阵容。而且,当然,定义行为并不意味着你总会获得所需的行为 - 人们仍然可以编写表达式,在不需要时包装(而不是溢出)。没有办法消除所有人为错误。
Footnote
1在其他地方的讨论中,有可能在深奥的C实现中char
和int
具有相同的大小,在这种情况下unsigned char
将被提升为unsigned int
。出于所有实际目的,您可以忽略这一点。
以上是关于如何对char类型进行安全算术运算的主要内容,如果未能解决你的问题,请参考以下文章