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的物理内存里存储的二进制。

 

posted @ 2021-07-09 15:13  元几科技  阅读(1279)  评论(0编辑  收藏  举报