C中的字符操作



当您在C中将一个字符强制转换为int时,到底发生了什么?既然字符是一个字节,int是四个字节,那么如何获得字符的整数值呢?是比特模式被视为一个数字吗。以字符"A"为例。位模式是否为01000001(即二进制65)?

charint都是整数类型。

当您将一个值从任何算术(整数或浮点)类型转换为另一个算术类型时,转换会尽可能保留。算术转换总是根据值而不是表示来定义的(尽管有些规则是为了在大多数硬件上简单实现而设计的)。

在你的情况下,你可能有:

char c = 'A';
int i = c;

c是具有值65的类型char的对象(假定ASCII表示)。从charint的转换产生具有值65int。编译器生成实现这一点所需的任何代码;在表示方面,它可以是符号扩展,也可以是0位填充。

当源表达式的值可以表示为目标类型的值时,这适用。对于charint的转换,(几乎)总是这样。对于其他一些转换,当值不合适时,有各种规则可供选择:

  • 对于任何到浮点或从浮点转换,如果值超出范围,则行为是未定义的((int)1.0e100可能会产生一些任意值,或者它可能会使程序崩溃),如果它在范围内但不精确,则通过四舍五入或截断来近似
  • 对于有符号或无符号整数到无符号整数的转换,结果被包装(unsigned)-1 == UINT_MAX)
  • 对于将有符号或无符号整数转换为有符号整数,结果是实现定义的(环绕式语义很常见)——或者可以引发实现定义的信号

(浮点转换也必须处理精度问题。)

除了将整数转换为无符号类型之外,您通常应该避免超出范围的转换。

顺便说一句,虽然int在您的系统中可能恰好是4个字节,但它可以是任何大小,只要它能够表示从-32767+32767的值即可。各种整数类型的范围,甚至字节中的位数,都是由实现定义的(标准施加了一些限制)。8位字节几乎是通用的。32位int非常常见,尽管较旧的系统通常具有16位int(我曾在具有64位int的系统上工作过)。

最新更新