【问题标题】:Character operations in CC中的字符操作
【发布时间】:2014-10-22 21:26:57
【问题描述】:

当您在 C 中将字符转换为 int 时,究竟发生了什么?由于字符是一个字节,整数是四个,你怎么能得到一个字符的整数值呢?是否将其视为数字的位模式。以字符“A”为例。位模式是 01000001(即二进制 65)吗?

【问题讨论】:

  • 'A' 已经是 C 中的 int。无论哪种方式,'A' 都是 65 的语法糖(假设是 ASCII 实现)。这能回答你的问题吗?
  • char 在 C 中是一个 integer 类型。
  • 位模式始终被“视为一个数字”——您可以对char 操作数应用您对int 操作数应用的任何算术运算。碰巧的是,当您使用printf(或在某些情况下,通过调试器)将其发送到控制台时,您会将其视为“字符”。

标签: c char arithmetic-expressions


【解决方案1】:

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 的系统上工作过)。

【讨论】:

  • 更正:整数和浮点之间的转换是明确定义的,只要它们在目标类型的范围内。
  • @david.pfx:你是对的。这其实是我的意思,但我写错了。明天左右我会修复答案。
  • 是的,我知道你知道,但结果不太对。
  • 符号扩展是什么意思
猜你喜欢
  • 2017-06-06
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2020-09-04
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多