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 ++中基本操作的输出是什么类型的?
答案 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 *和/的操作数应具有算术或无范围 枚举类型; %的操作数应具有整数或未整数 枚举类型。 执行通常的算术转换 操作数并确定结果的类型。
类型char
和short
的转化排名小于int
类型的排名。