当我在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时会发生什么?
答案 0 :(得分:7)
算术运算符的参数得到“通常的算术促销”。
如果int可以表示所有操作数的所有值(在大多数实现中就是您的示例),则首先将参数转换为int。因此,在这两种情况下,您都会得到正确的结果。
答案 1 :(得分:1)
6.3.1.3有符号和无符号整数
1当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它将保持不变。
2否则,如果新类型是无符号的,则通过重复添加或>减去一个可以在新类型中表示的最大值的值来转换该值,直到>值在新的范围内。类型。
3否则,新类型已签名且值无法在其中表示;或者>结果是实现定义的,或者引发实现定义的信号。