在C语言中,经常会发生int和char之间的自动转换,那么其间会有怎样的规则呢?我们可以看看下面的源代码。
/**
* int 和 char 之间的转换:
* 这里涉及到 ASCII 码,
* ASCII 码使用指定的 7位 或 8位 二进制数组合来表示 128 或 256 种可能的字符。
* 我们可以先到书中或者网上查看ASCII字符代码表, 以便更好的理解这些内容。
*
*
* char转换为int的规则: 按照ASCII字符代码表转换成int的值。
*
*
* int转换为char的规则:
* C语言中int是四个字节, char是1个字节, 占字节多的int型向字节少的char型强制类型转换的原理就是字节截断。
* 转换时系统会自动删除高位的三个字节, 只留下低位的1个字节(1Byte=8bit), 这就是int型转换char型的时候可能丢失数据的原因。
*
*
* char型变量参与加减乘除的时候会先按照ASCII字符代码表转换成int的值。
* 例如: char型变量与char型变量相加的时候, 并不是直接拼接成字符串, 而是先都转换成int的值, 然后两个int的值相加。
*/
void int2char() {
char a = 120;
char b = 120;
char c;
// i=2400=0b100101100000。
int i = (a+b)*10;
// j=96, 十进制数值96 对应着 字符 '`' 。
int j = 0b01100000;
// 截取i的低位的1个字节(1Byte=8bit), 其值跟j的值相等。
c = i;
/**
* 注: int型变量按char格式打印, 或者 char型变量按int格式打印, 都是参照ASCII字符代码表的。
* 而且, int型变量按char格式打印的时候会进行字节截断, 因此输出的值有可能变小。
* 区间 [128, 255] 的所有整数 按char格式打印出来的字符都是 '?' 。
*/
printf("|1 %c %c %c %c %c |\n", a, b, c, i, j);
printf("|2 %d %d %d %d %d |\n", a, b, c, i, j);
}
运行输出结果如下:
|1 x x ` ` ` |
|2 120 120 96 2400 96 |
最后附贴一张ASCII字符代码表: