零位擴展和符號位擴展


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、從上機的敘述得知,有符號數向其它類型數據轉化(charint,charunsigned int)時,進行符號位擴展;無符號數向其它類型轉換(unsigned charint, 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM