补码表示的16进制数转有符号十进制数 C++

参考了CSDN上一个大佬的代码,学习了做一下记录。

#include <iostream>
using namespace std;

int hextode(char* hexstr)
{
    if(hexstr ==NULL)
        return 0;
    char binary[17]={0};//放二进制字符串
    //Convert strings to a long-integer value.
    long i32=strtol(hexstr,NULL,16);//读取16进制的值
    int toint = 0;
    int ratio = 1;
    if(hexstr[0]>'8')
    {
        //Converts an integer to a string
        itoa(i32,binary,2);/*输出为二进制*/
        for(int i=1;i<16;i++) //除第一位外取反
        {
            binary[i] ='0'+!(binary[i]-'0');
        }
        cout<<endl;
        int nTakeover = 0;
        bool isoverflow = false;
        for(int i=15;i>=0;i--) //二进制加1
        {
            int nsum = binary[i]-'0'+nTakeover; //每位加上进位
            if(i==15)
                nsum++;
            if(nsum==2)
            {
                if(i == 0)
                    isoverflow = true;
                else
                {
                    nsum-=2;
                    nTakeover = 1;
                    binary[i] = '0'+nsum;
                }
            }
            else
            {
                binary[i] = '0'+nsum;
                break;
            }
        }
        for(int j=15;j>0;--j)
        {
            toint = toint+ (binary[j]-'0')*ratio;
            ratio=ratio*2;
        }
        toint = toint*(-1);
        return toint;
    }
    else
    {
        toint= i32;
        return toint;
    }
}

int main(){
    char * strhex = "f280";
    int result = hextode(strhex);
    cout<< result<<endl;
}

PS:仅作学习,侵权删除!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值