C拼图;乘以Char的

时间:2014-03-02 03:56:21

标签: c char arithmetic-expressions

最近,我的C教授给了我们以下谜题:

char c1, c2, c3;

c1 = 'a';
c2 = 'e';
c3 = c1 * c2;
printf("%c",c3);

答案:E

然而,除了让产品已经记忆之外,我对如何直观地解决这个问题感到有些困惑。根据我的研究,字符'a'和'b'的int值分别为97和101,'E'为69,这是我很难理解结果是如何实现的。

3 个答案:

答案 0 :(得分:4)

首先,97 * 1019797。 (十六进制,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的字符集的系统,值分别为9710169,但在使用EBCDIC的系统上,值将完全不同。

假设与ASCII兼容的字符集,c1c2的值将在乘法之前提升为int。乘法的结果是9797十进制,或0x2645十六进制。

该作业会将结果从int转换为char。如果char是有符号类型(通常是这样),则转换的结果是实现定义的,但通常通过丢弃除低位之外的所有位来完成。如果char是无符号类型,则转换已明确定义,并以模CHAR_BIT + 1为模(简称为模块256)。

分配给c3的值可能将为0x45,或69为十进制,或'E'为字符(再次假设与ASCII兼容的字符集。)

因此,如果满足一些假设,则输出为E

  • 该实现使用基于ASCII的字符集(可以是ASCII,或Latin-1,或Windows-1252,或Unicode,或......);
  • 普通char是无符号的,或者已经签名,从intchar的转换会丢弃高位;和
  • 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