Convert signed short with bitset

Convert signed short with bitset

本文关键字:bitset with short signed Convert      更新时间:2023-10-16

我想转换字符串与0和1的符号短。这个可以,但是负数的值是错的。我认为,问题在于从无符号到有符号的转换。如何解决这个问题?例子:971是971,425是425,-122是3974,-394是3702,-2032是2064

bitset<12> b(binary);//binary is string of 0 and 1
 cout<<(signed short)b.to_ulong()<<"n";

在16位有符号整数中,负数表示为:

1xxx xxxx xxxx xxxx

正数如:

0xxx xxxx xxxx xxxx

的例子:

0000 1111 1000 0110 => 3974

您需要的是一个12位整数,其中负数表示为:

.... 1xxx xxxx xxxx

的例子:

.... 1111 1000 0110 => -122

你可以这样做:

#include <iostream>
#include <bitset>
#include <string>
using namespace std;
struct C {
    signed short b : 12; // 12 bit integer
};
int main() {
    string binary = "111110000110"; // 3974
    bitset<12> b(binary);
    struct C c = { static_cast<signed short>(b.to_ulong()) };
    cout << c.b << "n"; // prints -122
}

对于从12位有符号整数到12位无符号整数的转换,您得到的值是正确的。

例如,-122作为一个有符号的12位整数,在二进制中表示为111110000110,这也是3974作为一个无符号的12位整数的二进制表示。

你在期待什么?

编辑

我现在看到您正在尝试将输出转换为有符号短格式。考虑到short是16位,而bitset是12位填充到unsigned long中。to_ulong函数不执行符号扩展(它没有上下文使它能够确定是否需要符号扩展,从而清除bitset中表示的最有效位),因此您得到的是您的位模式所代表的无符号数。