可隐式转换为char的int最大值是多少?为何2130会转为R?
关于int隐式转换为char的两个问题解答
1. 可隐式转换为char类型的int数值最大是多少?
这个得分情况讨论,因为C标准并没有强制规定char必须是有符号还是无符号类型,不同系统或编译器设置下结果会不一样:
- 如果是无符号char(常见于部分嵌入式系统或特定编译选项),它的取值范围是
0到255,所以能直接隐式转换且不发生截断的最大int值就是255。要是int值超过255,转换时会被截断成对256取模的结果。 - 如果是有符号char(绝大多数桌面系统的默认设置),它的取值范围是
-128到127,所以能正常转换且不触发溢出的最大int值是127。如果int值大于127,转换后的结果是实现定义的,但在现代系统里一般会变成负数(基于补码规则)。
划个重点:当int值超出char的取值范围时,转换结果属于实现定义行为,不过几乎所有现代系统都会直接取int的最低8位作为char的值(相当于按256取模后处理符号)。
2. 为什么代码里的2130转换后是'R'?
先明确:字符'R'的ASCII码值是82。我们来拆解2130这个数:
2130 = 256 × 8 + 82
当把int类型的2130转换为char时,在几乎所有现代系统中,都会截断到char的宽度——也就是只保留数值的最低8位二进制。2130的二进制是100001110010,取最后8位就是01010010,转换成十进制正好是82,对应的ASCII字符就是'R'。
说白了就是:int转char时,超出char范围的数值会被按char的位数(通常是8位)取模,2130对256取模得到82,刚好对应'R'的ASCII码,所以输出就是'R'。
内容的提问来源于stack exchange,提问作者Reena
相关产品推荐
相关产品推荐

