首页 > 其他 > 详细

VC中怎么实现任意进制数间的转换?

时间:2021-06-01 15:03:08      阅读:15      评论:0      收藏:0      [点我收藏+]

      编程过程中,常用的进制有2、8、10、16进制,有时要遇到它们之间的互换。我们可以自己定义一套函数来实现这个问题,这种处理方法较复杂,且还不一定准确,尤其是负数或者小数的转换就更难了。其实VC自带的一些函数就能够实现这些功能,这里就是这种方法。

1、为了便于理解源代码,以下顺便介绍一下整数的表示法。

(1)、在C/C++中,整数常量可以加上不同的前缀,表示不同的进制:

十进制:不带前缀,默认表示为十进制;

八进制:0前缀 表示八进制;

十六进制:0x 或 0X 前缀表示十六进制;

二进制:没有直接表示二进制数形式的整数,只能用字符串来表达。

(2)、整数常量还可以加上不同的后缀,表示不同的数据类型:

无符号:U

长整数:L

2、_itoa ()、strtol()的用法

    我们利用C语言运行库中的_itoa ()、strtol(),就可以实现任意进制间的转换。

   _itoa ()方法可以十进制整数转换为2、8、16进制数(字符串形式)。

它的声明如下:

char *_itoa(

   int value,

   char *str,

   int radix

);

参数value:为输入参数,欲转换的整数。

参数str:为输出参数,存储转换后的结果。

参数 radix:为输入参数,欲转换的进制,可以是10进制、16进制等。

返回值:返回一个指向str的指针。

 

   strtol ()方法可以2、8、10、16进制数(字符串形式) 转换为10进制整数。

它的声明如下:

long strtol(

   const char *nptr,

   char **endptr,

   int base

);

参数nptr:为输入参数,欲转换的字符串。

参数endptr:为输出参数,返回指向不能被识别的第一个字符的指针。

参数 radix:为输入参数,欲转换的进制,可以是10进制、16进制等;必须与nptr一致,如nptr为二进制数,则base为2。

返回值:返回字符串nptr中合法部分对应的整数。

 

//如下代码用来验证strtol()函数第2个参数的用法

char *pos;

long lVal = strtol("123abc", &pos, 10);

CString strRes;

strRes.Format("%d",lVal);

MessageBox(strRes);//结果为123

strRes.Format("%s",pos);

MessageBox(strRes);//结果为abc

 

lVal = strtol("123", &pos, 10);

strRes.Format("%d",lVal);

MessageBox(strRes);//结果为123

strRes.Format("%s",pos);

MessageBox(strRes);//结果为空字符串

 

      本例的关键代码如下:

//一、十进制(int)变为二、八、十六进制(CString)

void CSample1Dlg::OnBnClickedButton1()

{

       //1、十进制变为二进制

       CString strRes;

       int iVal = 13;

       char sRes[16];

       _itoa(iVal,sRes,2);

       strRes.Format("%s",sRes);

       MessageBox(strRes);//结果为1101

 

        //2、十进制变为八进制

       ::memset(sRes,0,sizeof(sRes));

       //将sRes清空,sizeof(sRes)为16,而不是"1101"对应的4

       _itoa(iVal,sRes,8);//十进制变为八进制(字符串)

       strRes.Format("0%s",sRes);//在sRes的前边加0,表示八进制

       MessageBox(strRes);//结果为015

 

        //3、十进制变为十六进制

       ::memset(sRes,0,sizeof(sRes));//将sRes清空

       _itoa(iVal,sRes,16);

       strRes.Format("0x%s",sRes);//在sRes的前边加0x,表示十六进制

       MessageBox(strRes);//结果为0xd

}

 

//二、八进制(int)变为二、十、十六进制(CString)

void CSample1Dlg::OnBnClickedButton2()

{

        //1、八进制变为二进制

       CString strRes;

       int iVal = 015;//八进制015,等效十进制数为13

       char sRes[16];

       _itoa(iVal,sRes,2);

       strRes.Format("%s",sRes);

       MessageBox(strRes);//结果为1101

 

        //2、八进制变为十进制

       ::memset(sRes,0,sizeof(sRes));//将sRes清空

       _itoa(iVal,sRes,10);

       strRes.Format("%s",sRes);

       MessageBox(strRes);//结果为13

 

        //3、八进制变为十六进制

       ::memset(sRes,0,sizeof(sRes));//将sRes清空

       _itoa(iVal,sRes,16);

       strRes.Format("0x%s",sRes);//在sRes的前边加0x,表示十六进制

       MessageBox(strRes);//结果为0xd

}

 

//三、十六进制(int)变为二、八、十进制(CString)

void CSample1Dlg::OnBnClickedButton3()

{

        //1、十六进制变为二进制

       CString strRes;

       int iVal = 0xd;//十六进制0xd,等效十进制数为13

       char sRes[16];

       _itoa(iVal,sRes,2);

       strRes.Format("%s",sRes);

       MessageBox(strRes);//结果为1101

      

        //2、十六进制变为八进制

       ::memset(sRes,0,sizeof(sRes));//将sRes清空

       _itoa(iVal,sRes,8);

       strRes.Format("0%s",sRes);//在sRes的前边加0,表示八进制

       MessageBox(strRes);//结果为015

 

       //3、十六进制变为十进制

       ::memset(sRes,0,sizeof(sRes));//将sRes清空

       _itoa(iVal,sRes,19);

       strRes.Format("%s",sRes);

       MessageBox(strRes);//结果为13

}

 

//四、二进制(char*)变为八、十、十六进制(CString)

void CSample1Dlg::OnBnClickedButton4()

{

       //1、二进制变为十进制

       CString strRes;

       char sRes[16];

       long lVal; //long与int等效

       char *sVal = "1101";

       lVal = ::strtol(sVal,NULL,2);

       //由于第一个参数为二进制的字符串,则第三个参数为2;

       //同理,若第一个参数为十六进制的字符串,则第三个参数为16。

       //返回值都为十进制数,sVal为13。

       strRes.Format("%d",lVal);

       MessageBox(strRes); //结果为13

 

       //2、二进制变为八进制

       //方法(1):利用CString的格式化控制符

       strRes.Format("%#o",lVal);//"%#o"控制符,用于将整数变为八进制

       MessageBox(strRes);//结果为015

      

       //方法(2):先将二进制变为十进制,然后将十进制变为八进制

       //_itoa(lVal,sRes,8);//十进制变为八进制(字符串)

       //strRes.Format("0%s",sRes);//在sRes的前边加0,表示八进制

       //MessageBox(strRes);//结果为015     

 

       //3、二进制变为十六进制

       //先将二进制变为十进制,然后将十进制变为十六进制

       //方法(1):利用CString的格式化控制符

       strRes.Format("%#x",lVal);//"%#x"控制符,用于将整数变为十六进制

       //strRes.Format("%x",lVal);//"%x"控制符也可以将整数变为十六进制

       MessageBox(strRes);//结果为0xd

      

       //方法(2):先将二进制变为十进制,然后将十进制变为十六进制

       //::memset(sRes,0,sizeof(sRes));//将sRes清空

       //_itoa(lVal,sRes,16);

       //strRes.Format("0x%s",sRes);//在sRes的前边加0x,表示十六进制

       //MessageBox(strRes);//结果为0xd

}

VC中怎么实现任意进制数间的转换?

原文:https://www.cnblogs.com/it001xyz/p/14835741.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!