当您在C中将一个字符强制转换为int时,到底发生了什么?既然字符是一个字节,int是四个字节,那么如何获得字符的整数值呢?是比特模式被视为一个数字吗。以字符"A"为例。位模式是否为01000001(即二进制65)?
char
和int
都是整数类型。
当您将一个值从任何算术(整数或浮点)类型转换为另一个算术类型时,转换会尽可能保留值。算术转换总是根据值而不是表示来定义的(尽管有些规则是为了在大多数硬件上简单实现而设计的)。
在你的情况下,你可能有:
char c = 'A';
int i = c;
c
是具有值65
的类型char
的对象(假定ASCII表示)。从char
到int
的转换产生具有值65
的int
。编译器生成实现这一点所需的任何代码;在表示方面,它可以是符号扩展,也可以是0位填充。
当源表达式的值可以表示为目标类型的值时,这适用。对于char
到int
的转换,(几乎)总是这样。对于其他一些转换,当值不合适时,有各种规则可供选择:
- 对于任何到浮点或从浮点转换,如果值超出范围,则行为是未定义的(
(int)1.0e100
可能会产生一些任意值,或者它可能会使程序崩溃),如果它在范围内但不精确,则通过四舍五入或截断来近似 - 对于有符号或无符号整数到无符号整数的转换,结果被包装(
unsigned)-1 == UINT_MAX)
- 对于将有符号或无符号整数转换为有符号整数,结果是实现定义的(环绕式语义很常见)——或者可以引发实现定义的信号
(浮点转换也必须处理精度问题。)
除了将整数转换为无符号类型之外,您通常应该避免超出范围的转换。
顺便说一句,虽然int
在您的系统中可能恰好是4个字节,但它可以是任何大小,只要它能够表示从-32767
到+32767
的值即可。各种整数类型的范围,甚至字节中的位数,都是由实现定义的(标准施加了一些限制)。8位字节几乎是通用的。32位int
非常常见,尽管较旧的系统通常具有16位int
(我曾在具有64位int
的系统上工作过)。