如何对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,它也会被提升为int1,并且在C中没有完全指定int值的算术(特别是,溢出时的行为是未定义的)。立即将每个对象强制转换为unsigned将有效地回避这一点,从而对无符号值进行算术运算,这是更完全定义的。

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

Footnote

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

以上是关于如何对char类型进行安全算术运算的主要内容,如果未能解决你的问题,请参考以下文章

算术运算符

C#如何对二维数组矩阵进行算术运算

从C ++代码中提取算术运算信息[关闭]

C语言如何定义一个算术表达式

《Java架构筑基》从Java基础讲起——Java运算符

Java编程思想笔记-类型转换