我有这样的代码:
#include <stdio.h>
int main()
{
char a=20,b=30;
char c=a*b;
printf("%c\n",c);
return 0;
}
这个程序的输出是X。
如果 a*b=600 溢出,因为 char 值介于 -128 和 127 之间,这个输出怎么可能?
最佳答案
char
是有符号的还是无符号的是实现定义的。无论哪种方式,它都是一个整数类型。
无论如何,由于 integer promotions,乘法作为 int
完成并将结果转换为 char
。
如果该值不适合“较小”类型,则它是为 signed char
定义的实现,这是如何完成的。大多数(如果不是全部)实现只是简单地切断了高位。
对于 unsigned char
,标准实际上要求(简要地)切除高位。
所以:
(int)20 * (int)20 -> (int)600 -> (char)(600 % 256) -> 88 == 'X'
(假设 8 位 char
)。
有关详细信息,请参阅链接及其周围的段落。
注意:如果您启用编译器警告(一如既往的推荐),您应该会收到一个针对赋值的截断警告。这可以通过显式转换来避免(仅当您真正确定所有含义时)。 gcc 选项是 -Wconversion
。
关于C 中的字符乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889944/