C中的字符操作

标签 c char arithmetic-expressions

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

最佳答案

charint 都是整数类型。

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

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

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

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

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

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

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

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

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

关于C中的字符操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25558590/

相关文章:

c - dll 中控制台 I/O 的最佳选择

c - 指针之谜/菜鸟问题

c - 分隔字符串中的字符并将其值分配给变量

bash - bash 中 $[a-b] 和 $((a-b)) 之间的区别

c++ - 哪些整数运算是不安全的?

c - 串行 c 在 linux 中读取有问题

高效计算数据流的最大值和最小值

Java 字符 [] 到字符串

c++ - 从字符串常量到 'char*' 的折旧转换

c - 为什么我的计算器函数没有返回正确的结果?