1. 程式人生 > 其它 >c++有符號型別與無符號型別之間的型別強制轉換

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
-----------------------------------------------------------------------------