C++中unsigned char和char相乘的区别

3

为什么当char与整型字面量相乘时会发生溢出,而unsigned char不会,在强制转换为intunsigned int时呢?

#include <memory>
#include <iostream>

using namespace std;

int main(void)
{
    char MAX1=200;
    unsigned char MAX2=200;

    cout << MAX1*3 << endl;
    cout << MAX2*3 << endl;

    return 0;
}

以上代码输出:

-168

600


(注:该段英文原句中有拼写错误,已做修正)

4
尝试在乘法运算之前打印 MAX1 - Baum mit Augen
2
@A.S.H 顺便说一下,cout << +MAX1 << "\n"; 也可以工作,并且看起来更酷。 ;) - Baum mit Augen
MAX1 * 3 被提升为有符号整数。MAX2 * 3 被提升为无符号整数。 - rcgldr
2
我不认为这是rcgldr的情况。它们都是整数。https://ideone.com/N6L7UO - druckermanly
1
@ZdravkoDonev:回答自己的问题没问题...那就是一个答案。 - Martin Bonner supports Monica
显示剩余4条评论
2个回答

2
区别不在于你所认为的乘法,而是在于一开始的赋值。需要注意的重要事情是,char 是有符号还是无符号是由具体实现定义的。
在你的平台上,char 显然是有符号的,因此不能表示 200。这留下了一个变量 MAX1,它具有实现定义的值,在我们的情况下是 -56。(由于常见平台上的 2s 补码。)
然后,对于两个变量来说,乘法部分是相同的:操作数会被提升为 int,因为(无符号)char 的转换等级低于 int 的转换等级,我们最终得到的相当于:
cout << int(-56) * 3 << endl;
cout << int(200) * 3 << endl;

如预期一样,这会打印出:

-168
600


0

哦,是的!我现在清楚了。两者都被转换为int,只是MAX1已经溢出,然后被转换为int,然后乘以。感谢@BaummitAugen


请注意,Baum现在已经发布了一个扩展答案 - Bhargav Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接