【发布时间】:2018-01-04 13:51:10
【问题描述】:
在纯 C 中,char 类型是至少 8 位宽的类型,具有实现定义的符号。
正如When to use the plain char type in C 问题的答案所暗示的,当您的数据类型有意为字符串并且行为类似于普通C 字符串时,应使用此类型,例如允许使用标准库中的string.h 函数.
但是,在某些情况下,您可能需要对这些值进行算术运算。例如 UTF-8 数据,您必须自己编写某种类型的处理器或显示例程(您的目标上没有合适的库解决方案)。
如何以最安全、最便携的方式处理这种情况?
【问题讨论】:
-
明确声明签名?
signed char和unsigned char具有完全指定的行为。您仍然可以使用普通的char,只需在将其用于算术目的之前转换为char的适当签名版本(重要:您需要两步转换,到char的适当签名,然后到适当的必要时调整大小的类型;当char碰巧被签名并且设置了高位时,(unsigned)mychar将行为不端,除非您这样做(unsigned)(unsigned char)mychar)。 -
@ShadowRanger 我目前的想法大致是:在需要处理此类的例程中,通常具有指向 char 输入的指针,将单个值转换为
unsigned char或signed char以适合任何算术。 -
不,如果您坚持将
char类型仅用于字符数据的做法,那么您永远不需要对该类型的值执行算术运算。字符不是数字,因此对它们的算术定义不明确。字符在计算机内存中表示为数字意味着您在技术上可以对它们执行算术运算,但这样做时您不再将它们视为字符。如果你想执行算术,你应该通过适当的机制(可能只是赋值或强制转换)转换为任何其他数字类型。 -
@JohnBollinger:“所以对它们的算术定义不明确”我反对。 “您应该转换为任何其他数字类型” 为什么? C 隐含地做到了这一点。请看我之前的评论。