关于 Bits Tool V1 的一些细节

在很早之前,Bits Tool V1 已经有了雏形,可以完成基本的二进制和十六进制之间的转换以及 bit 位的显示和选取功能,不过十进制转换的功能一直没有加进去。上周末,参考了网上的算法,将十进制和二进制转换功能加了进去。展现层面使用的是 MFC ,实现层面用的是 C++,LT 遇到了一些细节,记录下来思路,以备忘。

1. C++变量直接初始化

由于自己对C++的一知半解,对C++的对象初始化,一直采用 “=” 的复制方法,读了《C++ Primer》后,发现推荐 ()的直接初始化方法,于是将HDBconv的内部一些初始化方法更改为了()的方法。至于优缺点,LT 现在还体验不出来。

int a = 1;
int b(1);

2. pow() 重载

在编写二进制转化十进制的函数时,使用了pow()函数,意欲计算2的N次方,但是发现VC6下通过编译,但是在VS2010下编译报错,说重载类型不对。

pow(2,i);

更改为 2.0 后解决

pow(2.0,i);

3. INT 整型溢出

Bits Tool 对数据的处理需求是十六进制最大为 FFFFFFFF,不考虑符号,转化为十进制是 4294967295。对十进制处理时,因为输入的数值 4294967295 被作为字符串字面值赋值给函数,即 CString sDEC_INPUT = “4294967295”,然后使用 atoi() 将字符串转化为整型。但是程序测试结果却不对。单步 debug 才找到原因,原来 int 最大为 2147483647,远不能承载 4294967295的值,就溢出了。

int iNumerartor = atoi(sDEC_INPUT); // 将自字符串字面值转化为整形

更改为无符号的

unsigned int iNumerartor = (unsigned int)atof(sDEC_INPUT); // 将自字符串字面值转化为整形,注意INT型的最大值

4. 负整数

本工具没有考虑32位整数为负的情况,所以 FFFFFFFF 转化为整数为 4294967295 。下一步将考虑负整数的处理。(20140629 已改写函数支持负整数)

如果不考虑符号,那么直接加1就进位,一直向上增大即可。但是如果是负数,就要考虑负整数在二进制中是怎么存储的了

5. CHBDconv 类的重写

goteet 朋友给了一些改写的建议,比如 将输入字符合法化的检测移出类的成员函数,这个已经完成。还有目前成员函数是返回一个CSting对象,形式不是很合理,这个是下一步也要改写的。

class CHBDconv  
{
public:
	CString HEX2BIN(CString sHEX_INPUT); //形式不合理,需要改写
	CString BIN2HEX(CString sBIN_INPUT);
	CString DEC2BIN(CString sDEC_INPUT);
	CString BIN2DEC(CString sBIN_INPUT);
	CString DEC2HEX(CString sDEC_INPUT);
	CString HEX2DEC(CString sHEX_INPUT);
	CHBDconv();
	virtual ~CHBDconv();

};

( 20140629 改写为下面的声名形式,将转换放置在参数部分,函数返回转换结果。这样逻辑上更合理 )

class CHBDconv  
{
public:
	bool Hex2Bin(CString sHex_input, CString &sBin_Output);
	bool Bin2Hex(CString sBin_Input, CString &sHex_Output);
	bool Dec2Bin(CString sDec_Input, CString &sBin_Output, bool bSigned = true);
	bool Bin2Dec(CString sBin_Input, CString &sDec_Output, bool bSigned = true);
	//下面函数是组合而来
	bool Hex2Dec(CString sHex_Input, CString &sDec_Output, bool bSigned = true);
	bool Dec2Hex(CString sDec_Input, CString &sHex_Output, bool bSigned = true);
	//

};

6. ++i 和 i++ 的区别

看了 C++ Primer 后,for循环做了一些改写,由原来的 i++

for (int i=0;i<10;i++)

改写为 ++i

for (int i=0;i!=10;++i)

主要是 ++i 的效率要比 i++ 高,因为 i++ 中间多了一个临时变量。

扩展阅读:

关键字:溢出, 重载, 初始化

Leave a Reply

Your email address will not be published. Required fields are marked *