无论如何,现在可用的C++编译器实现已经很丰富了,在Windows平台上的实现就有若干种,比较常用的有Visual C++ 6.0附带的C++编译器实现,和Borland C++ Builder附带的C++测试实现。
简单地说,就是在右移正数时高位补0、右移负数时则高位补1,而无符号右移操作符>>>在右移时不考虑符号问题,即无论右移正数还是负数,其***位都是补0。无符号右移本质上是将被右移的数所有存储位都视为数据位,因此很容易想到,如果想在C++测试中实现无符号右移,可以先将拟进行无符号右移的数转换成无符号类型,然后执行普通右移就可以了。
以下是在VS2003中编写的验证代码:
- #include "stdafx.h"
- #include "iostream"
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- int nOrg;
- cout << "被移位数:";
- cin >> nOrg;
- cout << "有符号右移2位:"
- << (nOrg >> 2 )
- << endl;
- unsigned int nuNum = (unsigned)nOrg;
- cout << "转换为无符号数:"
- << nuNum
- << endl;
- cout << "无符号右移2位:"
- << (nuNum >> 2 )
- << endl;
- return 0;
- }
一旦我们认识了C++测试在一些领域是有需求的(值得学习和掌握的)这个问题之后,就可以接下来讨论“怎样正确学习和掌握C++”这个核心问题了。 其实,对于这个问题,Bjarne已经宣传了十年。早在99年的时候Bjarne就写了“Learning C++ as A New Language”,并在好几篇技术访谈(这里,这里,这里,还有这里)里面提到如何正确对待和使用C++中支持的多种抽象机制的问题。Andrew Koenig也写了一本现代C++教程《Accelerated C++》(这本书后面还会提到)。
然而这么多年来,C++社群的状况改善了吗?就我所知,就算有改善,也是很小的。学习者还是盲目钻语言细节,只见树木不见森林;网上还是弥漫着各种各样的“技术”文章和不靠谱的“学习C++测试的XX个建议”;一些业界的有身份的专家还是在一本接一本的出语言孔乙己的书(写一些普通程序员八辈子用不着的技巧和碰不着的角落);而业界真正使用C++的公司在面试的时候还总是问一些边边角角的细节问题。#t#
而不是考察编程的基本素养(不,掌握所有的语言细节也不能让你成为一个合格的程序员)。这个面试理念是错误的,估计其背后的推理应该是“如果这个家伙不知道这个细节,那么估计他对语言也熟悉不到哪儿去;而如果他知道,那么虽然他可能并不是好的程序员,但我们还是能够就后一个问题进一步测试的”,这个理念的问题在于,对语言熟悉到一定程度(什么程度后面会具体建议)就已经可以很好的编程了(剩下的只需查查文档);
而很多公司在C++测试“对语言熟悉程度”的时候走得明显太远了(比如,问临时对象生命期和析构顺序当然是无可厚非的,但问如何避免一个类被拷贝或者如何避免其构建在堆上?);当然,有些语言知识是必须要提前掌握的,具体有哪些后面会提到,面试的时候并非不能问语言细节,关键是“问哪些”。