我希望将0和1的转换字符串转换为short。这项工作,但负数我有错误的价值观。我认为,问题是从无签名转换为签名。怎么解决这个问题? 例: 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";
答案 0 :(得分:1)
对于从12位有符号整数到12位无符号整数的转换,您获得的值是正确的。
例如,作为带符号的12位整数的-122将以二进制表示为111110000110,这也是3974的无符号12位整数的二进制表示。
你在期待什么?
修改强>
我现在看到你正在尝试转换为签名的输出短路。考虑一个short是16位,而你的bitset是12位填充到unsigned long。函数to_ulong不执行符号扩展(它没有上下文可以使它确定是否需要符号扩展,从而清除超出bitset中表示的最重要的位),因此你得到的是你的位模式代表它是无符号数。
答案 1 :(得分:1)
在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
}