C字谜;乘字符';s
最近,我的C教授给了我们以下难题:C字谜;乘字符';s,c,char,arithmetic-expressions,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,这是我很难理解的结果是如何实现的 首先,97*101是9797。(十六进制,0x2645) 而char是1字节。所以0x2645变成0x45 0x45==69==E'。就是这
char c1, c2, c3;
c1 = 'a';
c2 = 'e';
c3 = c1 * c2;
printf("%c",c3);
答复:E
然而,我有点困惑,除了已经记住产品之外,如何直观地解决这个问题。根据我的研究,字符“a”和“b”的int值分别为97和101,“E”为69,这是我很难理解的结果是如何实现的 首先,
97*101
是9797
。(十六进制,0x2645
)
而char
是1字节。所以0x2645
变成0x45
0x45==69==E'
。就是这样。首先,97*101
是9797
。(十六进制,0x2645
)
$ 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
是1字节。所以0x2645
变成0x45
0x45==69==E'
。就这样
$ 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。9797的二进制表示中的有效位丢失,这是因为8位算术为您提供了69,即E
char c1, c2, c3;
c1 = 'a';
c2 = 'e';
c3 = c1 * c2;
char
为8位,最大允许256位。当你把97和101相乘时,你得到了9797。9797的二进制表示中的有效位丢失,这是因为8位算术为您提供了69,即E
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\u位+1
的模减少(很可能是模块256)
分配给c3
的值可能是十进制的0x45
,或69
,或作为字符的'E'
(再次假设ASCII兼容字符集)
因此,如果满足许多假设,则输出为E
:
- 该实现使用基于ASCII的字符集(可以是ASCII、拉丁语-1、Windows-1252、Unicode或…)李>
- 普通
是无符号的,或者它是有符号的,从char
到int
的转换丢弃高阶位;及char
CHAR\u位==8
- 有人愿意编写愚蠢的代码,将
值相乘,将产品存储回char
对象,然后打印结果。这样的代码可能有助于测试您对C的理解,但它没有实际用途(很多课堂练习都是这样)char
'E'
C语言不指定字符'a'
、'e'
和'e'
(或除空字符'\0'
以外的任何字符)的数值。对于使用基于ASCII的字符集的系统,值分别为97
、101
和69
,但在使用EBCDIC的系统上,值将大不相同
假设是ASCII兼容字符集,c1
和c2
的值将在乘法之前提升为int
。乘法的结果是十进制的9797
或十六进制的0x2645
赋值将该结果从int
转换为char
。如果char
是有符号类型(通常是这样),则转换的结果由实现定义,但通常通过丢弃除低阶位以外的所有位来完成。如果char
是无符号类型,则转换定义良好,并以char\u位+1
的模减少(很可能是模块256)
分配给c3
的值可能是十进制的0x45
,或69
,或作为字符的'E'
(再次假设ASCII兼容字符集)
因此,如果满足许多假设,则输出为E
:
- 该实现使用基于ASCII的字符集(可以是ASCII、拉丁语-1、Windows-1252、Unicode或…)李>
- 普通
是无符号的,或者它是有符号的,从char
到int
的转换丢弃高阶位;及char
CHAR\u位==8
- 有人愿意编写愚蠢的代码,将
值相乘,将产品存储回char
对象,然后打印结果。这样的代码可能有助于测试您对C的理解,但它没有实际用途(很多课堂练习都是这样)char
c1*c2
中,结果类型为int
。它被铸造成char
。(带符号的int)0x2645
和(带符号的字符)0x45
ar