乘以无符号字符时溢出?

Jan*_*egg 7 c int casting overflow char

当我在C中乘以两个无符号字符时,如下所示:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;
Run Code Online (Sandbox Code Playgroud)

然后我知道我会溢出,因此我得到(40'000模256).当我这样做:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;
Run Code Online (Sandbox Code Playgroud)

我会得到正确的结果40'000.但是,我不知道这会发生什么:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;
Run Code Online (Sandbox Code Playgroud)

我可以确定正确的事情发生了吗?这个编译器是否依赖?同样,我不知道做减法时会发生什么:

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;
Run Code Online (Sandbox Code Playgroud)

当使"c"成为无符号字符时,我可能会得到255.当我使用这样的int时会发生什么?

APr*_*mer 7

算术运算符的参数得到"通常的算术促销".

在int可以表示所有操作数的所有值的情况下(在大多数实现中,您的示例就是这种情况),首先将参数转换为int.因此,在这两种情况下,您都会得到正确的结果.