首先應知道的類型轉換規則
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的物理內存里存儲的二進制。