【问题标题】:Type of char multiply by another charchar 的类型乘以另一个 char
【发布时间】:2017-04-20 22:10:52
【问题描述】:

C/C++中两个字符相乘的结果是什么类型?

unsigned char a = 70;
unsigned char b = 58;
cout << a*b << endl; // prints 4060, means no overflow
cout << (unsigned int)(unsigned char)(a*b) << endl; // prints 220, means overflow

我希望将 T 类型(例如,char、short、int)的两个数相乘的结果变为 T。对于 char,它似乎是 int,因为 sizeof(a*b) 是 4。

我写了一个简单的函数来检查乘法结果的大小:

template<class T>
void print_sizeof_mult(){
  T a;
  T b;
  cout << sizeof(a*b) << endl;
}

print_sizeof_mult&lt;char&gt;()print_sizeof_mult&lt;short&gt;()print_sizeof_mult&lt;int&gt;() 是 4,print_sizeof_mult&lt;long&gt;() 是 8。

这些结果是否仅适用于我的特定编译器和机器架构?还是在某处记录了 C/C++ 中基本操作的输出是什么类型?

【问题讨论】:

  • 如果T 的所有可能值都在int 的范围内,则将两个T 相乘的类型为int。 C++ 标准记录了这种行为。 C 和 C++ 是不同的语言,在 C 中,您的代码将左移一个名为 cout 的变量
  • @M.M:实际上,在 C 语言中,编译器会开始向 template&lt; 抱怨。
  • 见“整体推广”:en.cppreference.com/w/cpp/language/…

标签: c++ implicit-conversion integer-promotion


【解决方案1】:

根据 C++ 标准(4.5 整体促销

1 除 bool、char16_t、char32_t 或 wchar_t 其整数转换等级 (4.13) 小于 如果 int 可以表示所有,则 int 可以转换为 int 类型的纯右值 源类型的值;否则,源纯右值可以是 转换为 unsigned int 类型的纯右值。

和(5个表达式)

10 许多二元运算符需要算术或运算操作数 枚举类型导致转换并产生类似的结果类型 方式。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:

....

  • 否则,积分促销(4.5)应在两者上执行 操作数.61 那么以下规则应适用于提升 操作数:

最后(5.6 乘法运算符)

2 * 和 / 的操作数应具有算术或无作用域 枚举类型; % 的操作数应具有整数或无范围 枚举类型。 通常的算术转换是在 操作数并确定结果的类型。

charshort 类型的转化排名低于 int 类型的排名。

【讨论】:

  • 记住这些规则对于将charshort 视为“存储类型”很有用,即只有当您将数据存储在内存中时才会发挥作用的较小类型(并且您想要节省一些);在执行操作时,它们实际上并不存在,一旦数据在寄存器中,算法就会在完整的寄存器大小中完成(这是 int 最初的值 - 对应于机器寄存器的值)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2014-04-03
  • 2020-02-05
  • 1970-01-01
  • 2012-11-16
  • 2023-03-16
  • 2020-08-24
相关资源
最近更新 更多