乘以无符号字符时溢出?

时间:2011-06-07 14:16:37

标签: c casting char overflow int

当我在C中乘以两个无符号字符时:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;

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

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;

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

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;

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

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;

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

2 个答案:

答案 0 :(得分:7)

算术运算符的参数得到“通常的算术促销”。

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

答案 1 :(得分:1)

从此回复中复制In a C expression where unsigned int and signed int are present, which type will be promoted to what type?

  

6.3.1.3有符号和无符号整数

     

1当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它将保持不变。

     

2否则,如果新类型是无符号的,则通过重复添加或>减去一个可以在新类型中表示的最大值的值来转换该值,直到>值在新的范围内。类型。

     

3否则,新类型已签名且值无法在其中表示;或者>结果是实现定义的,或者引发实现定义的信号。