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
所以這裡如果對charch這個變數ch,使用強制型別轉換成int或unsignedint那麼實際是對實體記憶體裡的二進位制值進行的操作。
即: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的實體記憶體裡儲存的二進位制。
-----------------------------------------------------------------------------交流QQ號:1175372067
電話:18551717618(同微信)
元幾科技.軟體3部
邁開步伐去探索
南京元幾科技有限公司
元幾社區: https://www.cnblogs.com/colin-vio
元幾官網: http://www.yuanji.tech
-----------------------------------------------------------------------------