我知道在这里有很多关于从/到二进制补码格式转换的类似问题,我尝试了很多,但是对我来说似乎没有帮助。

好吧,我正在从事一个嵌入式项目,该项目涉及通过SPI写入/读取从设备的寄存器。这里涉及的寄存器是22位位置寄存器,以二进制补码格式存储uStep值,范围为-2 ^ 21至+ 2 ^ 21 -1。问题是当我读取寄存器时,我得到一个与实际值无关的大整数。

例:

向从站发送命令以移动4000步(正向/正向)后,我读取了位置寄存器,我得到的正是4000。但是,如果我发送反向移动命令(例如-1),然后读取该寄存器,则该值我得到的像是4292928。我相信这是寄存器的负偏移,因为二进制补码不为零。我向设备发送负整数以移动x步数没有问题,但是,从获取的值中获取实际的负整数是另一回事。

我知道这涉及二进制补码,但是问题是,如何从那个奇怪的值中得到实际的负整数?我的意思是,如果我将设备移动了-4000步,那么我要怎么做才能使负步距寄存器远的确切值准确呢?

最佳答案

您需要通过左边的位对位21进行符号扩展。

对于设置了位21的负值,可以通过对值与0xFFC00000进行或运算来实现。

对于当位21清零时的正值,可以通过将值与0x003FFFFF进行“与”运算来确保。

关于c - 从二进制补码值Embedded C中获取负整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43560956/

10-12 00:43