简体   繁体   中英

converting signed and unsigned hex to dec and dec to hex C++

I have to write a program that converts unsigned hex to dec and dec to hex and signed hex to dec and dec to hex, without using the stream filters "hex" and "dec". My program works for the unsigned converting of hex to dec and dec to hex but NOT for the SIGNED hex to dec and dec to hex. Any help would be greatly appreciated. Thank You in advance!

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

void convertDecToHex(unsigned hexNumber);
int convertHexToDec(char hex[], unsigned numberSize);
signed SignedDecToHex (signed DecNumberSigned);
signed SignedHexToDec (int number);

int main (){
    unsigned choice, numberSize = 0, hexNumber;
    signed DecNumberSigned;
    char hex[100000];
    string number, HexNumberSigned;

    while (1){
        cout << "Enter 1 to convert from unsigned Dec to Hex:" << endl <<     "Enter 2 to convert from unsigned Hex to Dec:" 
            << endl << "Enter 3 to convert from signed Dec to Hex:"<< endl    << "Enter 4 to convert from signed Hex to Dec:" << endl ;
        cin >> choice;

        if (choice == 1){
            cout << "Enter unsigned dec # to convert to hex: " << endl;
            cin >> hexNumber;
            convertDecToHex( hexNumber);
        }//1
        if (choice == 2){
            cout << "Enter unsigned hex # to convert to dec: " << endl;
            cin >> number;
            numberSize = number.size();
            strcpy(hex, number.c_str());
            cout << convertHexToDec(hex, numberSize) << endl;
        }//2
        if (choice == 3){
            cout << "Enter signed dec to convert to hex: " << endl;
            cin >> DecNumberSigned;
            convertDecToHex( SignedDecToHex(DecNumberSigned));
        }//3
                if (choice == 4){
            cout << "Enter signed hex to convert to dec: " << endl;
            cin >> HexNumberSigned;
            numberSize = HexNumberSigned.size();
            strcpy(hex, HexNumberSigned.c_str());
             cout << SignedHexToDec(convertHexToDec( hex,  numberSize)) <<     endl;
        }//4
    }//while
    system ("pause");
}//main

 void convertDecToHex(unsigned hexNumber){
int remainder, i=0;
    unsigned m[99999], total, x;
    char n [99999];

    i=0;
    do {
        remainder = hexNumber % 16;
        hexNumber /= 16;
        m[i] = remainder;
        i++;
    }//doLooop
    while (hexNumber > 0);
    total = i;

    for (i=0, x = total - 1; i < total; i++, x--){
        if (m[i] == 1) n[x] = '1';
        if (m[i] == 2) n[x] = '2';
        if (m[i] == 3) n[x] = '3';
        if (m[i] == 4) n[x] = '4';
        if (m[i] == 5) n[x] = '5';
        if (m[i] == 6) n[x] = '6';
        if (m[i] == 7) n[x] = '7';
        if (m[i] == 8) n[x] = '8';
        if (m[i] == 9) n[x] = '9';
        if (m[i] == 10) n[x] = 'A';
        if (m[i] == 11) n[x] = 'B';
        if (m[i] == 12) n[x] = 'C';
        if (m[i] == 13) n[x] = 'D';
        if (m[i] == 14) n[x] = 'E';
        if (m[i] == 15) n[x] = 'F';
    }

    for (i=0; i < total; i++)
        cout << n[i];
    cout << endl;

}//DecToHex
int convertHexToDec(char hex[], unsigned numberSize){
    int i, j;
    int n[10000];
    unsigned sum = 0;
    char a,b,c,d,e,f;

    for (i = 0 ; i < numberSize; i++){
        if (hex[i] == '1') n[i] = 1;
        if (hex[i] == '2') n[i] = 2;
        if (hex[i] == '3') n[i] = 3;
        if (hex[i] == '4') n[i] = 4;
        if (hex[i] == '5') n[i] = 5;
        if (hex[i] == '6') n[i] = 6;
        if (hex[i] == '7') n[i] = 7;
        if (hex[i] == '8') n[i] = 8;
        if (hex[i] == '9') n[i] = 9;
        if (hex[i] == 'a' || hex[i] == 'A') n[i] = 10;
        if (hex[i] == 'b' || hex[i] == 'B') n[i] = 11;
        if (hex[i] == 'c' || hex[i] == 'C') n[i] = 12;
        if (hex[i] == 'd' || hex[i] == 'D') n[i] = 13;
        if (hex[i] == 'e' || hex[i] == 'E') n[i] = 14;
        if (hex[i] == 'f' || hex[i] == 'F') n[i] = 15;

    }//forLoop

    for (i = 0, j = numberSize - 1; i < numberSize , j >= 0 ; i++, j--)
        sum += pow(16,i) * n[j];

    return sum;

}//HexToDec

signed SignedDecToHex (signed DecNumberSigned){
    signed convertNumber;
    convertNumber = DecNumberSigned + (pow (2,16));
    return convertNumber;
 }// SignedDecToHex

 signed SignedHexToDec (int number){
     int newNumber;
    newNumber = number - (pow (2,16));
    return newNumber;

 }//SingedHexToDec

Don't use pow() when doing integer arithmetic. pow returns values as double which is inexact, and may result in the value being off by one when converting it to an int .

Theoretically doubles may be exact when working with numbers being powers of two. But that assumes that you know what you are doing, which at the moment, you don't :-)

Better use bit-shifting when possible:

pow(2,n) --> 1 << n

How to implement pow(16, n) using bitshifting is left as excercise for the reader.

Hint: ((i^n)^m) = i ^ (n*m)

I use some like this:

long int dec = strtol("0x0A01006F", NULL, 16); // return 167837807
printf("%d\n", dec);
long int hex = strtol("167837807", NULL, 10); // return A01006F
printf("%02X\n", hex);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM