最近,我的C教授给了我们以下谜题:
char c1, c2, c3;
c1 = 'a';
c2 = 'e';
c3 = c1 * c2;
printf("%c",c3);
答案:E
然而,除了让产品已经记忆之外,我对如何直观地解决这个问题感到有些困惑。根据我的研究,字符'a'和'b'的int值分别为97和101,'E'为69,这是我很难理解结果是如何实现的。
答案 0 :(得分:4)
首先,97 * 101
是9797
。 (十六进制,0x2645
)。
和char
是1byte。因此0x2645
成为0x45
。
0x45 == 69 == 'E'
。就是这样。
答案 1 :(得分:1)
char c1, c2, c3;
c1 = 'a';
c2 = 'e';
c3 = c1 * c2;
结果是实现定义的,但可能是'E'
。
C语言未指定字符'a'
,'e'
和'E'
(或除空字符'\0'
以外的任何字符)的数字值。对于使用基于ASCII的字符集的系统,值分别为97
,101
和69
,但在使用EBCDIC的系统上,值将完全不同。
假设与ASCII兼容的字符集,c1
和c2
的值将在乘法之前提升为int
。乘法的结果是9797
十进制,或0x2645
十六进制。
该作业会将结果从int
转换为char
。如果char
是有符号类型(通常是这样),则转换的结果是实现定义的,但通常通过丢弃除低位之外的所有位来完成。如果char
是无符号类型,则转换已明确定义,并以模CHAR_BIT + 1
为模(简称为模块256)。
分配给c3
的值可能将为0x45
,或69
为十进制,或'E'
为字符(再次假设与ASCII兼容的字符集。)
因此,如果满足一些假设,则输出为E
:
char
是无符号的,或者已经签名,从int
到char
的转换会丢弃高位;和CHAR_BIT == 8
最后:
char
值相乘的愚蠢代码,将产品存储回char
对象,然后打印结果。这样的代码可能对测试你对C的理解很有用,但它没有实际用途(很多课堂练习都是如此)。答案 2 :(得分:0)
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
97 * 101
9797
9797 % 256
69
quit
char
是8位,允许最大数为256.当你乘以97和101时,得到9797.由于8位算术给你带来了9797的二进制表示中的有效位这是E
。