char的类型乘以另一个char

时间:2017-04-20 22:10:53

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

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. int似乎char因为sizeof(a*b)是4。

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

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

print_sizeof_mult<char>()print_sizeof_mult<short>()print_sizeof_mult<int>()为4,print_sizeof_mult<long>()为8。

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

1 个答案:

答案 0 :(得分:3)

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

  

1除bool,char16_t,char32_t或之外的整数类型的prvalue   wchar_t,其整数转换等级(4.13)小于等级   如果int可以表示all,则int可以转换为int类型的prvalue   源类型的值;否则,源prvalue可以   转换为unsigned int类型的prvalue。

和(5个表达式)

  

10许多期望算术或算术操作数的二元运算符   枚举类型导致转换并产生类似的结果类型   办法。目的是产生一种普通类型,它也是一种类型   结果。这种模式称为通常的算术转换,   其定义如下:

...

  
      
  • 否则,将对两者进行整体促销(4.5)   操作数 .61然后,以下规则应适用于晋升   操作数:
  •   

最后(5.6乘法运算符)

  

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

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