2012-09-04 33 views
1

如何将签名的DWORD转换为无符号的DWORD?签名双字无符号双字没有二进制补码?

我有一种做法是二补的。

但是,当我这样做时,编译器给出了一个错误,即不允许对有符号数进行按位运算(按照MISRA规则2004第12条规则)。

那么我怎样才能转换为无符号双字?

long int num1,num2, 
unsigned long int num3; 

num1 = 293; 
num2 = 296; 

num3 = num1 - num2; 

如果我运行代码然后NUM3装载有一些0xFFFFFFE someValue中是这样的。

但实际上所需的值3应该得到存储?

所以我做了无符号long int num3 long int num3。

然后num3有符号值(-3在这种情况下)应该转换为3而不做二进制补码?

+0

将它转换为无符号的第一个,然后应用按位运算。 –

回答

3

从有符号到无符号转换的定义是取值为 的模数,以便结果始终对应于您通过采用二进制补码机上的原始位得到的结果 。但你 不想转换-3;你要转换的距离,这是 的差异的绝对值:abs(num1 - num2)

+0

但是在嵌入式c中,我猜abs函数是不允许的,那么在那种情况下我怎么转换? – danison

+1

@danison:'num3 =(num1

+0

@danison为什么不呢? (如果你不能使用'std :: abs',那么编写你自己的代码相当容易。) –

0
long num3; 
... 
if (num3<0) num3=-num3; 

或究竟是什么问题?

+0

考虑到'num3'有一个无符号类型,它的值永远不会小于0. –

相关问题