在C中将一个字符与另一个字符相乘

时间:2019-11-14 08:05:59

标签: c

我不明白为什么下面的C程序返回值34?

int main(void)
{
    char c;
    char  c1='a', c2='b';
    c= c1*c2;
    printf("%d", c);
}

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

Ascii值“ a”为97,“ b”为98。由于char(可以是signed charunsigned 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'的值分别为9798

当您进行乘法运算时,char值是promotedint值,因此这是一个简单的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。