C 中的字符乘法

标签 c char multiplication

我有这样的代码:

#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/

相关文章:

c - 如何获得临时文件名?

c++ - 如何使用可变参数列表、va_list、va_start、va_end 将百分比字符写入文件

arrays - 何时/为什么需要 '\0' 来标记 (char) 数组的结尾?

c++ - 编译器将随机字符添加到我的 char 数组

vhdl - 在 VHDL 中实现方程

c - C 中的矩阵乘法 - 结果矩阵中的错误值

python - 对由列表乘法创建的嵌套引用列表进行深度复制不起作用

c++ - MPI Isend 和 Irecv 问题

c - Fork()ing 并在特定的一组 CPU 上运行

c - 打印不显示所有字符的大长度字符串