在很早之前,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++ 中间多了一个临时变量。
扩展阅读:
- C++的一大误区——深入解释直接初始化与复制初始化的区别
http://blog.csdn.net/ljianhui/article/details/9245661
- copy initialization
http://en.cppreference.com/w/cpp/language/copy_initialization
http://zh.cppreference.com/w/cpp/language/copy_initialization
- i++ 与 ++i 的性能区别
http://www.gracecode.com/posts/1426.html
http://www.eskimo.com/~scs/cclass/notes/sx7b.html
关键字:溢出, 重载, 初始化