1.同类型有符号和无符号之间的转换
1.1无符号位转成有符号
首先判断无符号数的最高位是0还是1:
(一)如果是0,那么转换成有符号之后值不变
int main(void)
{
unsigned char a = 126;//其原码是:01111110,最高位为0
char b = (char) a;
printf("%d",b);
return 0;
}
输出的结果是:126
(二)如果最高位是1,那么按照补码的规则来计算这个原码
int main(void)
{
unsigned char a = 129;//129的原码是;10000001
char b = (char) a; //因为最高位是1,用补码来解读这个原码得到的十进制是-127
printf("%d",b);
return 0;
}
输出的结果是:-127
1.2有符号位转无符号
先判断有符号数的最高位是0还是1:
(一)最高位是0的话,表明是0-127的数字,不变
(二)最高位是1的话,表明是-128到-1的数字,则先用补码表示出这些负数,然后再用原码解读计算
总结:因为对于某个数据类型的有符号和无符号来说,他们总有一些值是相同的,这些值在转换的时候是不需要改变的。比如char里面的(0-127)是有符号和无符号都有的。
而对于其他的数字比如无符号里的(128-255),有符号里的(-128 到-1)这些都是各自独有的,所以我们首先先用二进制把他们表示出来,正数用原码表示,负数用补码表示(还记得我之前说过,计算机是用补码来表示负数的),再把(128-255)这些无符号数字转换成有符号时,把这些数字的原码当成补码来解读,计算得到转换值;相对应的就是把负数(补码表示)当成原码的方式来解读。
先判断有符号数的最高位是0还是1:
(一)最高位是0的话,表明是0-127的数字,不变
(二)最高位是1的话,表明是-128到-1的数字,则先用补码表示出这些负数,然后再用原码解读计算
总结:因为对于某个数据类型的有符号和无符号来说,他们总有一些值是相同的,这些值在转换的时候是不需要改变的。比如char里面的(0-127)是有符号和无符号都有的。
而对于其他的数字比如无符号里的(128-255),有符号里的(-128 到-1)这些都是各自独有的,所以我们首先先用二进制把他们表示出来,正数用原码表示,负数用补码表示(还记得我之前说过,计算机是用补码来表示负数的),再把(128-255)这些无符号数字转换成有符号时,把这些数字的原码当成补码来解读,计算得到转换值;相对应的就是把负数(补码表示)当成原码的方式来解读。
2 .不同长度类型的转换
1.短类型到长类型
(一)无符号短类型数据转换到长类型数据时候,直接在无符号短类型数据的左边填充0,补齐需要的位 。
比如unsigned char 转换到short or unsigned short时候,直接在左边补齐0,因为unsigned char的范围是0-255,而short和unsigned short的范围分别是(-32768-32767),(0-65535),这2个范围都包括unsigned char范围(0-255)
1.短类型到长类型
(一)无符号短类型数据转换到长类型数据时候,直接在无符号短类型数据的左边填充0,补齐需要的位 。
比如unsigned char 转换到short or unsigned short时候,直接在左边补齐0,因为unsigned char的范围是0-255,而short和unsigned short的范围分别是(-32768-32767),(0-65535),这2个范围都包括unsigned char范围(0-255)
(二)如果短类型是有符号 的,那么将短类型数据的左边全部填充短类型之前的符号位
比如 char 的范围是(-128 -127)在short中全部有,他的(0-127)在unsigned中也有,只剩下(-128 到 -1)在unsigned中没有,就只要改这一部分
假设127为01111111,他在变的时候就把最高位的0补起到最高位的左边。-127的二进制位是-10000001,他要变的时候就把最高位的1补齐到最高位左边。要补多少个0或者1呢?这要根据你要变的数据类型的长度与现在的数据类型的长度的bit差
比如 char 的范围是(-128 -127)在short中全部有,他的(0-127)在unsigned中也有,只剩下(-128 到 -1)在unsigned中没有,就只要改这一部分
假设127为01111111,他在变的时候就把最高位的0补起到最高位的左边。-127的二进制位是-10000001,他要变的时候就把最高位的1补齐到最高位左边。要补多少个0或者1呢?这要根据你要变的数据类型的长度与现在的数据类型的长度的bit差
2.长类型到短类型
规则是:将长类型比短类型多出的位从最高位开始截断
规则是:将长类型比短类型多出的位从最高位开始截断
比如 :
故输出结果是-1
如果改成
short a=32767;//二进制是0111111111111111;
char b =(char)a;//把0111111111111111左边八位截掉然后再赋给b,因为b是个有符号的,所以当他看到截断后的11111111,认为这是个负数,
//11111111就是补码,于是用补码来计算出他的十进制为-1
故输出结果是-1
如果改成
unsigned char b = (char) a;
则把11111111是无符号的,直接用原码的方式计算出他的值是255