c++有符號類型與無符號類型之間的類型強制轉換


首先應知道的類型轉換規則

1.計算機采用補碼形式存儲數值,即內存里的二進制數據是所表示數的補碼形式(!!!核心知識點)

2.整數的反碼是本身,負數的反碼是符號位不變,數據位按位取反

3.整數的補碼是本身,負數的補碼是反碼+1

4.字面常量的類型轉換,該字面常量會被當成unsigned 無符號類型對待,如static_cast<int>(0xb0) 將被轉換成 176

 

unsigned char uch= 0xB0;

char ch = 0xB0;

std::cout<<std::hex;

std::cout<<"uch:"<<static_cast<unsigned int>(uch)<<std::endl;

std::cout<<"to uint ch:"<<static_cast<unsigned int>(ch)<<std::endl;

std::cout<<"to int ch:"<<static_cast<int>(ch)<<std::endl;

std::cout<<"int ch:"<<static_cast<int>(static_cast<unsigned char>(ch))<<std::endl;

std::cout<<std::dec;

上面的程序輸出分別是:

uch:b0

to uint ch:ffffffb0

to int ch:-80

int ch:b0

 

物理內存二進制保存的到底是什么?

對char類型而言

-80  : 1101,0000 -------------->unsigned char :0xb0    1011,0000(這是實際物理內存里的二進制,而不是1101,0000)  。 這就是因為計算機物理內存是采用數值對應的補碼來存儲的。

這里-80對於char類型來說它的原碼二進制是1101,0000對就的補碼是1011,0000

所以這里如果對char ch這個變量ch,使用強制類型轉換成int或unsigned int那么實際是對物理內存里的二進制值進行的操作。

即:1011,0000-----(第1步因為是char類型所以-80先轉成泌表示,符號位與數據位分離多余的位用0填上)----->1000,0000|0000,0000|0000,0000|0101,0000----(該值對應的內存值即它的補碼是)1111,1111|1111,1111|1111,1111|1011,0000;它所對應的16進制值為0xffffffb0

 

1111,1111|1111,1111|1111,1111|1011,0000 這個值即是int num=-80,變量num的物理內存里存儲的二進制。

 


免責聲明!

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



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