C++ 有符号双字到无符号双字,没有两个补码?

C++ 有符号双字到无符号双字,没有两个补码?,c++,c,C++,C,如何将有符号双字转换为无符号双字 我有一种方法,那就是二的补足 但是,当我这样做的时候,编译器给出了一个错误,即有符号数字不允许按位操作(根据MISRA规则2004第12条规则) 那么,我怎样才能转换成无符号Dword呢 long int num1,num2, unsigned long int num3; num1 = 293; num2 = 296; num3 = num1 - num2; 如果我运行代码,那么num3将加载一些0xFFFFFFE somevalue,如下所示 但实际

如何将有符号双字转换为无符号双字

我有一种方法,那就是二的补足

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

那么,我怎样才能转换成无符号Dword呢

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,而不进行两次补码吗

long num3;
long num3;
...
if (num3<0) num3=-num3;
...
如果(num3有符号到无符号转换的定义是 模数的值,使结果始终符合您的要求 在2的补码机上取原始数据就可以了,但是你 不希望转换
-3
;您希望转换距离,即
差异的绝对值:
abs(num1-num2)

但是在嵌入式c中,我猜abs函数是不允许的。那么在这种情况下,我要转换多少?@danison:
num3=(num1
@danison为什么不允许?(如果你不能使用
std::abs
,那么编写自己的代码就相当容易了。)首先将其强制转换为unsigned,然后应用逐位运算。如果
num3
具有unsigned类型,则其值永远不会小于0。