编程过程中,常用的进制有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
}
原文:https://www.cnblogs.com/it001xyz/p/14835741.html