1. 简述
实际上,小数也是存在进制转换的,本文主要给出整型的进制转换代码实现。函数原型如下:
char* ChangeFromDecimal(unsigned int value, int base); // value:10进制的数值;base:转化成的进制数;返回值:转化后的进制数,最后还增加了'\0' int ChangeToDecimal(char* value, int base); // 工作与ChangeFromDecimal相反,将某种进制的字符串表示,转化为int数值2. 代码实现
#include < iostream > #include < stack > using namespace std; char * ChangeFromDecimal(unsigned int value, int base ) { char * result; stack < char > result_stack; unsigned int tmp;
result_stack.push('\0'); while (value) { tmp = value % base ; value = value / base ; result_stack.push(tmp < 10 ? (tmp + ' 0 ' ) : (tmp - 10 + ' A ' )); } result = new char [result_stack.size() ]; tmp = 0 ; while ( ! result_stack.empty()) { result[tmp ++ ] = result_stack.top(); result_stack.pop(); } return result;} int ChangeToDecimal( char * value, int base ) { int result = 0 ; while ( * value != ' \0 ' ) { result = result * base ; result += ( * value) <= ' 9 ' ? ( * value - ' 0 ' ):( * value - ' A ' + 10 ); value ++ ; } return result;} int main() { int num = 253 ; char * result; cout << (result = ChangeFromDecimal(num, 2 )) << endl; cout << ChangeToDecimal(result, 2 ) << endl; cout << " ---------------------------------------- " << endl; delete []result; cout << (result = ChangeFromDecimal(num, 8 )) << endl; cout << ChangeToDecimal(result, 8 ) << endl; cout << " ---------------------------------------- " << endl; delete []result; cout << (result = ChangeFromDecimal(num, 16 )) << endl; cout << ChangeToDecimal(result, 16 ) << endl; delete []result; result = 0 ; system( " PAUSE " ); return 0 ;}
3. 重点说明
· 对于大于等于10的数字和小于10的数字要分别处理,尤其是'0'-'9'与'A'-'Z'的ASCII码是不连续的。
· 如果使用参数代替返回值的话,对于char*,要使用char*&,对于int,要使用int*。 · 由于英文字母有限,base是有限制的,10个数字加上26个字母,最多能够表示的也就是36进制。 · 最重要的一点是第一个函数将int转化为字符串进制时,一定要将int解释为unsigned int,因为函数中用到了取余运算,如果不解释的话,对于负数,计算后显示会出错的。 而第二个函数却不需要一定返回unsigned int,返回int也可以的,因为其中,只是对数值进行乘法和加法。当然,全部使用unsigned int实际上是最保险的方式,也是最安全的。如果都用unsigned int,第一个函数传入int,就会直接被转化为unsigned int,只要对第二个函数的返回值,强制转化为int,即可得到合理的显示。