C++ 中注意,零擴充套件和符號位擴充套件
阿新 • • 發佈:2019-02-19
首先,介紹一下兩種擴充套件的定義
符號擴充套件:當用更多的記憶體儲存某一個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件一個負數的時候需要將擴充套件的高位全賦為1.對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0.比如一個用一個8位二進位制表示-1,則是10000001
如果把這個書用16位二進位制表示時,則為11111111 10000001 高位全都是1,這個叫做符號擴充套件,主要用於對其運算元。
零擴充套件就是全補零。不論其符號位是多少,高8位全都補0.
能過上面的定義可以看出在C++中,如果把一個char向一個整形轉換的時候,就會存在著這個問題
如果你想得到一個正數,那麼如果一個字元的ASCII碼值是小於零的,而直接用(int)c進行強制型別轉換,結果是通過符號擴充套件得到的也為一個負數。要得到正數,一定要用(int)(unsigned char)c;因為unsigned char去除了c的符號位,所以,這樣的型別轉換後,再用(int)進行轉換得到的就是一個正數。
例項如下:
執行結果:
sign extension: -127
zero extension: 129
請按任意鍵繼續. . .