C中未签名和签名的部门

时间:2012-02-23 12:21:33

标签: c

在我的程序中,两个变量被声明为有符号长(假设32位机器上的X和Y),并且这些变量被一个接一个地划分(X / Y)。

最终值分配给无符号长变量(假设为Z)。我不确定这是对还是错。我只是调试一个由一些人编写的代码。我想这可能会导致溢出或未定义状态。

以下四种情况会发生什么,

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

我知道%u表示无符号,%d表示整数。我的问题是关于在上述四种情况下Z中存储的值。

非常感谢任何帮助。

3 个答案:

答案 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)