零位扩展和符号位扩展
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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的零位扩展和符号位扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010与.NET4系列 23.Vi
- 下一篇: Java IO流操作规律