在我的程序中,两个变量被声明为有符号长变量(比如说32位机器上的X和Y),并且它们被彼此相除(X/Y)。最后一个值被赋值给了一个unsigned long变量(比如Z)。我不确定这是正确的还是错误的赋值。我只是在调试一个由某人编写的代码。我猜这可能会导致溢出或未定义状态。下面四种情况会发生什么,
Z =+X/+Y Z =+X/-Y Z =-X/+Y Z =-X/-Y
我知道% u表示无符号,% d表示整数。我的问题是在上面四种情况下,Z中存储的是什么值。任何帮助都将不胜感激。
kgsdhlau1#
如果你的变量是有符号的,一切都很好。如果你得到一个负的除法结果,也许之后会有一个(不想要的?)转换。处理包含无符号值的表达式比较麻烦。
(1U-2)/10
会产生意想不到的结果。
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)
ut6juiuv3#
如果除法的结果是负数,你将得到垃圾。例如:
unsigned z; int a = 10; int b = -2; z = a/b;
然后z == 4294967291。
z == 4294967291
3条答案
按热度按时间kgsdhlau1#
如果你的变量是有符号的,一切都很好。如果你得到一个负的除法结果,也许之后会有一个(不想要的?)转换。
处理包含无符号值的表达式比较麻烦。
会产生意想不到的结果。
zhte4eai2#
Z将存储整数除法的值,但由于Z是无符号的,所有值都将是正的,因此符号位不会被处理,而是作为数字的一部分,也不会有二进制补码转换。例如,如果无符号int是32位宽:
ut6juiuv3#
如果除法的结果是负数,你将得到垃圾。
例如:
然后
z == 4294967291
。