已签名双字无符号双字没有二进制补码?

时间:2012-09-04 17:01:31

标签: c++ c

如何将签名的DWORD转换为无符号DWORD?

我有一种做法,就是两个补码。

但是,当我这样做时,编译器会给出一个错误,即对于带符号的数字不允许按位操作(根据MISRA规则2004第12条规则)。

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

long int  num1,num2,
unsigned long int num3;

num1 = 293;
num2 = 296;

num3 = num1 - num2;

如果我运行代码,那么num3会加载一些像这样的0xFFFFFFE somevalue。

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

所以我将unsigned long int num3设为long int num3。

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

2 个答案:

答案 0 :(得分:3)

从签名到无签名的转换定义是采取 模数值,使结果始终对应于你 通过在二进制补码机器上取原点来获得。但是你 不想转换-3;你想转换距离,这是 差异的绝对值:abs( num1 - num2 )

答案 1 :(得分:0)

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

究竟是什么问题?