C中的无符号除法和有符号除法

roqulrg3  于 2023-02-15  发布在  其他
关注(0)|答案(3)|浏览(293)

在我的程序中,两个变量被声明为有符号长变量(比如说32位机器上的X和Y),并且它们被彼此相除(X/Y)。
最后一个值被赋值给了一个unsigned long变量(比如Z)。我不确定这是正确的还是错误的赋值。我只是在调试一个由某人编写的代码。我猜这可能会导致溢出或未定义状态。
下面四种情况会发生什么,

Z =+X/+Y  
Z =+X/-Y  
Z =-X/+Y  
Z =-X/-Y

我知道% u表示无符号,% d表示整数。我的问题是在上面四种情况下,Z中存储的是什么值。
任何帮助都将不胜感激。

kgsdhlau

kgsdhlau1#

如果你的变量是有符号的,一切都很好。如果你得到一个负的除法结果,也许之后会有一个(不想要的?)转换。
处理包含无符号值的表达式比较麻烦。

(1U-2)/10

会产生意想不到的结果。

zhte4eai

zhte4eai2#

Z将存储整数除法的值,但由于Z是无符号的,所有值都将是正的,因此符号位不会被处理,而是作为数字的一部分,也不会有二进制补码转换。例如,如果无符号int是32位宽:

X = 1, Y = 1 -> Z = 1
X = -1, Y = 1 -> Z = 4294967295 = 0xFFFFFFFF (this would be -1 -two's complement- if Z was signed)
ut6juiuv

ut6juiuv3#

如果除法的结果是负数,你将得到垃圾。
例如:

unsigned z;
int a = 10;
int b = -2;
z = a/b;

然后z == 4294967291

相关问题