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

时间:2014-04-08 19:23:35

标签: c++ decimal hex twos-complement

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

我使用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 ++很新,所以请原谅我这是一个愚蠢的问题。另外,请忽略标题中的任何额外内容。这是一个大型项目的一部分,我无法记住标题的哪些部分与这段特定代码一起使用。

谢谢!

编辑:这主要是为了Ben。在阅读了您最近的评论后,我做了以下更改,但仍然只是得到我输入的十六进制数的十进制等值

#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;
}

3 个答案:

答案 0 :(得分:2)

你要求cin读为十进制(不做任何格式更改),所以只要它读取x,这不是0-9位,它就会停止,让你为零。

只需将hex添加到您的cin行:cin >> hex >> x2;

答案 1 :(得分:2)

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

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

这相当于:

  • 如果第一位为1,则为负数,其他所有位均为2&#39;
  • 通过减去0x8000
  • 来提取负部分
  • 否则低位只是正整数值

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

答案 2 :(得分:0)

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

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