1、
符號擴充套件:
當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1
;對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0
。 比如乙個用乙個8
位二進位制表示
-1,則是
10000001
如果把這個書用16
位二進位制表示時,則為
11111111 10000001
高位全都是
1,這個叫做符號擴充套件,主要用於對其運算元。
2、零擴充套件就是全補零
。不論其符號位是多少,高8
位全都補
0. 能過上面的定義可以看出在c++
中,如果把乙個
char
向乙個整形轉換的時候,就會存在著這個問題
如果你想得到乙個正數,那麼如果乙個字元的ascii
碼值是小於零的,而直接用
(int)c
進行強制型別轉換,結果是通過符號擴充套件得到的也為乙個負數。要得到正數,一定要用
(int)(unsigned char)c;
因為unsigned char
去除了c
的符號位,所以,這樣的型別轉換後,再用
(int)
進行轉換得到的就是乙個正數。
3、從上機的敘述得知,有符號數向其它型別資料轉化(如
char
到int,char
到unsigned int)
時,進行符號位擴充套件;無符號數向其它型別轉換(如
unsigned char
到int, long)
時,進行零擴充套件。
char
short
符號位擴充套件
char
unsigned char
最高位失去符號位意義,變為資料位
char
unsigned short
符號位擴充套件到short;
然後從short
轉到 unsigned short
unsigned char
char
最高位作為符號位
unsigned char
short
0擴充套件
unsigned char
float
轉換到long;
再從 long
轉換到float
4、由大資料型別向小資料型別轉換時,保留低位位元組。
unsigned long
char
保留低位位元組
unsigned long
short
保留低位位元組
示例#include
int main()
執行結果:
sign extension: -127
zero extension: 129
請按任意鍵繼續
. . .
原文:
C 中注意,零擴充套件和符號位擴充套件
首先,介紹一下兩種擴充套件的定義 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1.對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0.比如乙個用乙個8位二...
Java中符號位擴充套件
第乙個例子 byte b 100 b在記憶體中是以補碼的形式存貯的 1001 1100 如果執行char c char b 如企鵝先生所說 b要先變為int,這時增加的位全要用b的符號位填充 這就是符號擴充套件 變為 1111 1111 1111 1111 1111 1111 1001 1100 下...
C語言的位域和符號位擴充套件
最近面試易路聯動的時候考了位域方面的只是,結果全做錯了,回來想了會也沒弄明白,後來上網查了下原來是英特爾的面試題 如下 答案為 1,0,1,4 t.b 1很好理解,t.a和t.c等於 1就不大好理解了,這個就關係到資料型別與資料在計算機中的表示了,因為顯示的時候指定的是 d型別的,那麼說明將引數當成...