当我像这样在 C 中将两个无符号字符相乘时:
unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;
然后我知道我会发生溢出,结果我得到 (40'000 modulo 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 时会发生什么?
最佳答案
算术运算符的参数得到“通常的算术提升”。
在 int 可以表示所有操作数的所有值的情况下(在大多数实现中,您的示例就是这种情况),参数首先转换为 int。所以在这两种情况下,您都会得到正确的结果。
关于c - 乘以无符号字符时溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266582/