gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:18:11 25 4
gpt4 key购买 nike

如果这个问题已经得到解答,我深表歉意,但我找不到我要找的东西。

我正在使用 C++ 和 SPI 设备工作。 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++ 的新手,所以如果这是一个愚蠢的问题,请原谅。另外,请忽略标题中的任何额外内容。这是一个大型项目的一部分,我不记得 header 的哪些部分与这个特定的代码部分相关。

谢谢!

编辑:这主要是为了 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;
}

最佳答案

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

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

这相当于:

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

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

关于c++ - 将二进制补码输出转换为带符号的十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com