C中的字符操作

时间:2014-08-28 21:49:12

标签: c char arithmetic-expressions

当你将角色转换为C中的int时,到底发生了什么?由于字符是一个字节而int是四个,你怎么能得到一个字符的整数值?它是被视为数字的位模式吗?以角色'A'为例。位模式01000001(即二进制65)?

1 个答案:

答案 0 :(得分:6)

charint都是整数类型。

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

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

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

cchar类型的对象,其值为65(假设为ASCII表示)。从charint的转换产生int,其值为65。编译器会生成实现这一目标所需的任何代码;就表示而言,它可以用0位进行符号扩展或填充。

当源表达式的值可以表示为目标类型的值时,这适用。对于charint的转化,这种情况(几乎)总是如此。对于其他一些转换,当价值不合适时,有各种规则可以做什么:

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

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

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

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