我不明白为什么下面的C程序返回值34?
int main(void)
{
char c;
char c1='a', c2='b';
c= c1*c2;
printf("%d", c);
}
非常感谢您的帮助!
答案 0 :(得分:5)
Ascii值“ a”为97,“ b”为98。由于char
(可以是signed char
或unsigned char
depending on implementation)可以容纳最大值signed char
的值127(或unsigned char
的值255),您将获得:
97 * 98 modulo 128 = 34
好吧,用C表示法
(97*98) % 128 == 34
PS:用256替换128也会得到34。
答案 1 :(得分:4)
基本上char
只是一个小整数。
使用ASCII encoding(到目前为止最常用的编码),'a'
和'b'
的值分别为97
和98
。
当您进行乘法运算时,char
值是promoted到int
值,因此这是一个简单的97 * 98
乘法。其结果是9506
。
现在9506
可以容纳char
变量,因此它被截断了。如果使用十六进制表示法,则更容易看到结果值:十进制9506
是十六进制0x2522
。该值将被截断(通过与128
取模)为0x22
,十进制为34
。
答案 2 :(得分:1)
它可能使用ASCII进行编码。在ASCII中,O(log n)
等于'a'
,而97
等于'b'
。将它们相乘,得到98
。您正在将其分配给9506
,在大多数系统上为8位。 char
是37 * 256 + 34,因此为什么9506
被截断后会得到。之所以会出现这种截断,是因为34
可能是无符号的,如果一个无符号的整数类型不能表示该值,它将以其可以容纳的最大值+1(即char
的模数为模,因为无符号的char可以最多保留256
的值)。 here对此进行了解释:
无符号整数算术总是以2 n 取模,其中n为 该特定整数的位数。例如。对于
255
, 将unsigned int
加1得到``0'',并从``0''减去1得到UINT_MAX
。
答案 3 :(得分:0)
因为字符范围在-128到127或0到255之间。在这种情况下,c1和c2的整数值分别是97和98。 所以c = c1 * c2;将得出97 * 98 = 9506,当保存的值超出范围时,它将循环回到下限并继续。 只需交叉检查9506%256,您的结果就会为34。