首先应知道的类型转换规则
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的物理内存里存储的二进制。