将有符号和无符号十六进制转换为dec并转换为十六进制C ++

时间:2013-09-26 03:43:26

标签: c++

我必须编写一个程序,将无符号十六进制转换为十进制并转换为十六进制并将十六进制符号转换为十进制并转换为十六进制,而不使用流过滤器“hex”和“dec”。我的程序适用于十六进制到十进制和十六进制的无符号转换,但不适用于SIGNED十六进制到dec和十六进制。任何帮助将不胜感激。提前谢谢!

#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

2 个答案:

答案 0 :(得分:1)

进行整数运算时不要使用pow()pow会将值double返回为不精确的值,并且在将其转换为int时可能会导致值偏离1。

当使用数字为2的幂时,理论上双精度可能是精确的。但是假设你知道自己在做什么,目前你不知道: - )

尽可能更好地使用位移:

pow(2,n) - &gt; 1 << n

如何使用bitshifting实现pow(16, n)仍然是读者的练习。

提示:((i ^ n)^ m)= i ^(n * m)

答案 1 :(得分:0)

我使用的是这样的:

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);