C中的字符操作

use*_*929 1 c arithmetic-expressions char

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

Kei*_*son 6

char并且int都是整数类型.

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

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

char c = 'A';
int i = c;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

另外,虽然int可能恰好是你的系统上的4个字节,它可以是任何尺寸,只要它是能够从代表的数值-32767+32767.各种整数类型的范围,甚至是字节中的位数,都是实现定义的(标准强加了一些限制).8位字节几乎是通用的.32位int是很常见的,虽然旧系统通常有16位int(我已经在64位系统上工作int).