C字谜;乘字符';s

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'。就是这

最近,我的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'
。就是这样。

首先,
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
    值相乘,将产品存储回
    char
    对象,然后打印结果。这样的代码可能有助于测试您对C的理解,但它没有实际用途(很多课堂练习都是这样)
结果是实现定义的,但可能是
'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
    值相乘,将产品存储回
    char
    对象,然后打印结果。这样的代码可能有助于测试您对C的理解,但它没有实际用途(很多课堂练习都是这样)

产品的二进制值是多少?一个字符可以存储多少位?当你给一个字符分配一个int时会发生什么?@sharth我不这么认为。在
c1*c2
中,结果类型为
int
。它被铸造成
char
(带符号的int)0x2645
(带符号的字符)0x45
ar