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 <stdio.h>
int main()
{
int i =129;
char chA= (char)i;
int c = (int)(unsigned char)chA;
int b = (int)chA;
printf("sign extension: %d/n",b);
printf("zero extension: %d/n",c);
system("pause");
return 1;
}
運行結果:
sign extension: -127
zero extension: 129
請按任意鍵繼續. . .
原文:
http://blog.csdn.net/jaylong35/article/details/6160736
http://www.cnblogs.com/xiaoka/articles/2651366.html