繁体   English   中英

将二进制补码输出转换为带符号的十进制

[英]Converting two's complement output to signed decimal

如果这个问题已经回答,我很抱歉,但是我找不到我想要的东西。

我正在使用SPI设备进行c ++工作。 SPI器件以2的补码形式输出16位字的数据。 我试图将此数据转换为十进制以与过滤器一起使用。

我已经附上了一些示例代码,要求用户输入二进制补码的数字,然后输出带符号的十进制版本。

#include <iostream>     
#include <stdlib.h>
#include <cstdint>
#include <cmath>
#include <bitset>
using std::cout;
using std::endl;
using std::cin;
using std::hex;
using std::dec;
using std::bitset;
int main () {
    uint16_t x2=0;
    cout<<"Please enter the number you would like to convert from 2's complement.  "<<endl;
    cin>>x2;
    int diff=0x0000-x2;
    cout<<"The number you have entered is: "<<dec<<diff<<endl;
return 0;
}

当我运行该程序并输入0x3B4A之类的内容时,它始终输出0。我不确定是怎么回事,而且我对c ++还是很陌生,所以如果这是一个愚蠢的问题,请原谅。 另外,请忽略标题中的任何其他内容。 这是一个大型项目的一部分,我不记得标头的哪些部分与这段特定的代码一起使用。

谢谢!

编辑:这主要是本。 阅读您最近的评论后,我进行了以下更改,但仍只是获得与我输入的十六进制数等效的十进制数

#include <iostream>     
#include <stdlib.h>
#include <cstdint>
#include <cmath>
#include <bitset>
using std::cout;
using std::endl;
using std::cin;
using std::hex;
using std::dec;
using std::bitset;
int main () {
    int16_t x2=0;
    cout<<"Please enter the number you would like to convert from 2's complement.  "<<endl;
    cin>>hex>>x2;
    int flags= (x2>>14) & 3;
    int16_t value=(x2 << 2) >> 2;
    cout<<"The number you have entered is: "<<dec<<value<<endl;
return 0;
}

我不确定OP的问题是否有必要,但是对于只想将16位2的补码无符号整数转换为有符号整数的公式的任何人,我认为它的变体看起来像这样(对于输入val ) :

(0x8000&val ? (int)(0x7FFF&val)-0x8000 : val)

总计:

  • 如果第一位为1,则它为负数,所有其他位为2的补码
  • 通过减去0x8000提取负部分
  • 否则低位只是正整数值

将其包装在函数中并执行一些基本的错误检查(可能还可以强制输入实际上是一个无符号的16位整数)可能是个好主意。

您要求cin读取为十进制格式(不进行任何格式更改),因此,只要cin读取不是0-9位数的x,它就会停止,并为您保留零。

只需在您的cin行中添加hexcin >> hex >> x2;

标准库函数strtol将字符串输入转换为数字,并且只要您将0作为基数参数传递就支持0x前缀。

由于int16_t几乎可以肯定是16位二进制补码,因此可以使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM