当您在 C 中将一个字符转换为一个 int 时,到底发生了什么?由于字符是一个字节,而整数是四个字节,您如何获得字符的整数值?它是被视为数字的位模式。以字符“A”为例。位模式是 01000001(即二进制中的 65)吗?
最佳答案
char
和int
都是整数类型。
当您将值从任何算术(整数或浮点)类型转换为另一种算术类型时,转换会尽可能保留值。算术转换总是根据值而不是表示来定义(尽管一些规则旨在在大多数硬件上简单地实现)。
在你的情况下,你可能有:
char c = 'A';
int i = c;
c
是类型为 char
的对象,值为 65
(假设为 ASCII 表示)。从 char
到 int
的转换产生一个 int
,其值为 65
。编译器生成实现这一目标所需的任何代码;在表示方面,它可以进行符号扩展或用 0 位填充。
这适用于源表达式的值可以表示为目标类型的值的情况。对于 char
到 int
的转换,情况(几乎)总是如此。对于其他一些转化,当值不适合时,有各种规则可以执行:
- 对于与 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/