在我的程序中,两个变量被声明为有符号长(假设32位机器上的X和Y),并且这些变量被一个接一个地划分(X / Y)。
最终值分配给无符号长变量(假设为Z)。我不确定这是对还是错。我只是调试一个由一些人编写的代码。我想这可能会导致溢出或未定义状态。
以下四种情况会发生什么,
Z =+X/+Y
Z =+X/-Y
Z =-X/+Y
Z =-X/-Y
我知道%u表示无符号,%d表示整数。我的问题是关于在上述四种情况下Z中存储的值。
非常感谢任何帮助。
答案 0 :(得分:1)
如果除法结果为负,你就会得到垃圾。
例如:
unsigned z;
int a = 10;
int b = -2;
z = a/b;
然后z == 4294967291
。
答案 1 :(得分:0)
如果您的变量已签名,一切都很好。如果您提出否定的除法结果,或许之后会发生(不需要的?)转换。
使用包含无符号值的表达式会更加痛苦,例如
(1U-2)/10
给出意想不到的结果。
答案 2 :(得分:0)
Z将存储整数除法的值,但由于Z是无符号的,所有值都将为正,因此符号位不会被处理,而是作为数字的一部分,并且也将没有二的补码转换。例如,如果unsigned 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)