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

C中的无符号除法和有符号除法,c,C,在我的程序中,两个变量被声明为有符号长(比如32位机器上的X和Y),并且它们被一个除以另一个(X/Y) 最后一个值被赋给一个无符号长变量(比如Z)。我不确定这是对还是错。我只是在调试某个人编写的代码。我想这可能会导致溢出或未定义状态 在以下四种情况下会发生什么 Z =+X/+Y Z =+X/-Y Z =-X/+Y Z =-X/-Y 我知道%u表示无符号,%d表示整数。我的问题是,在上述四种情况下,Z中会存储什么值 非常感谢您的帮助。如果您的变量已签名,则一切正常。如果你得到一个负除

在我的程序中,两个变量被声明为有符号长(比如32位机器上的X和Y),并且它们被一个除以另一个(X/Y)

最后一个值被赋给一个无符号长变量(比如Z)。我不确定这是对还是错。我只是在调试某个人编写的代码。我想这可能会导致溢出或未定义状态

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

Z =+X/+Y  
Z =+X/-Y  
Z =-X/+Y  
Z =-X/-Y
我知道%u表示无符号,%d表示整数。我的问题是,在上述四种情况下,Z中会存储什么值


非常感谢您的帮助。

如果您的变量已签名,则一切正常。如果你得到一个负除法结果,可能会有一个(不需要的?)转换

使用包含无符号值的表达式更痛苦,例如

(1U-2)/10

给出意外的结果。

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)

若除法的结果是负数,你们将得到垃圾

例如:

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

然后
z==4294967291

为什么你不能自己尝试一下,有一个初步的想法?这不是一个关于除法的问题。这是一个关于有符号到无符号转换的问题:@JensGustedt你是在提倡通过试错法编程吗?“我认为这是一个拙劣的建议。”戴维:是的,你可以通过不去尝试来节省很多时间。直奔错误;-)我认为通过尝试获得“第一个想法”是合理的。第一个想法是可能行为的一个例子,只要你不认为这是唯一可能的行为,你就应该是好的。@DavidHeffernan,没有尝试,人们通常很难告诉我们他们期望什么。我期望从这样一个问题中得到类似“我对某某感兴趣”和“我的编译器给了我那个”。“正因为如此,我期待着一些不同的东西,你能告诉我哪里错了吗?”我同意你的观点,但如何控制这种情况而不保存那些意外的结果,特别是当其中一个结果为负(X和Y)时。@raki你是什么意思?当你试图在一个无符号类型中存储一个负值时,你希望发生什么?@raki,我没有得到你想要的。如果a<0或b<0,则必须以特殊方式处理此赋值,例如int x=(int)zI只需确保不会出现溢出或任何其他问题,特别是当除法结果被赋值给Z(无符号)时。我的问题是,它们中的任何一个变成负值(X或Y)。这部分代码将以PWM信号采用的不同X和Y值运行多次。这只是将-5转换为无符号整数的结果。