C 中注意,零擴充套件和符號位擴充套件

2021-05-24 04:30:39 字數 616 閱讀 2285

首先,介紹一下兩種擴充套件的定義

符號擴充套件:當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為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 

請按任意鍵繼續. . .      

零位擴充套件和符號位擴充套件

1 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1 對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0 比如乙個用乙個8 位二進位制表示 1,則是 100...

C語言的位域和符號位擴充套件

最近面試易路聯動的時候考了位域方面的只是,結果全做錯了,回來想了會也沒弄明白,後來上網查了下原來是英特爾的面試題 如下 答案為 1,0,1,4 t.b 1很好理解,t.a和t.c等於 1就不大好理解了,這個就關係到資料型別與資料在計算機中的表示了,因為顯示的時候指定的是 d型別的,那麼說明將引數當成...

Java中符號位擴充套件

第乙個例子 byte b 100 b在記憶體中是以補碼的形式存貯的 1001 1100 如果執行char c char b 如企鵝先生所說 b要先變為int,這時增加的位全要用b的符號位填充 這就是符號擴充套件 變為 1111 1111 1111 1111 1111 1111 1001 1100 下...