無論如何,現在可用的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++的公司在面試的時候還總是問一些邊邊角角的細節問題。
而不是考察編程的基本素養不,掌握所有的語言細節也不能讓你成為一個合格的程序員)。這個面試理念是錯誤的,估計其背後的推理應該是“如果這個家伙不知道這個細節,那麼估計他對語言也熟悉不到哪兒去;而如果他知道,那麼雖然他可能並不是好的程序員,但我們還是能夠就後一個問題進一步測試的”,這個理念的問題在於,對語言熟悉到一定程度什麼程度後面會具體建議)就已經可以很好的編程了剩下的只需查查文檔);
而很多公司在C++測試“對語言熟悉程度”的時候走得明顯太遠了比如,問臨時對象生命期和析構順序當然是無可厚非的,但問如何避免一個類被拷貝或者如何避免其構建在堆上?);當然,有些語言知識是必須要提前掌握的,具體有哪些後面會提到,面試的時候並非不能問語言細節,關鍵是“問哪些”。