Binary 使用位集将二进制中的负数转换为十进制 #包括 #包括 #包括 #包括 使用名称空间std; int main(){ 位集数(-5); if(num[0]) cout

Binary 使用位集将二进制中的负数转换为十进制 #包括 #包括 #包括 #包括 使用名称空间std; int main(){ 位集数(-5); if(num[0]) cout,binary,decimal,bitset,Binary,Decimal,Bitset,您必须将ulong减法的结果转换为有符号长: #include<cstdio> #include<bitset> #include<iostream> #include<cmath> using namespace std; int main(){ bitset<5> num(-5); if(num[0]) cout<<(num.to_ulong()-pow(2,5));// cout<

您必须将
ulong
减法的结果转换为有符号长:

#include<cstdio>
#include<bitset>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    bitset<5> num(-5);
    if(num[0])
        cout<<(num.to_ulong()-pow(2,5));// cout<<(num.to_ulong()-32);
    else    
        cout<<num.to_ulong();
    return 0;
}

事实上,如果没有它,它可以正常工作;注释部分不起作用,即使2^5和32都是完全起作用的相同值!这是因为从无符号long中减去一个数字总是产生无符号数字吗?实际的转换规则在语言规范中定义。在这种特殊情况下,文本的s类型的约束(有效地兼容所有有符号和无符号整数类型)小于函数结果的约束(无符号长),因此我猜这是自动强制转换决策的基础。但再一次,您可以在lagugae规范中查找特定规则。
(((long)num.to_ulong())-32)