强制类型转换


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)这些无符号数字转换成有符号时,把这些数字的原码当成补码来解读,计算得到转换值;相对应的就是把负数(补码表示)当成原码的方式来解读。



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)

(二)如果短类型是有符号 的,那么将短类型数据的左边全部填充短类型之前的符号位
比如 char 的范围是(-128 -127)在short中全部有,他的(0-127)在unsigned中也有,只剩下(-128 到 -1)在unsigned中没有,就只要改这一部分
假设127为01111111,他在变的时候就把最高位的0补起到最高位的左边。-127的二进制位是-10000001,他要变的时候就把最高位的1补齐到最高位左边。要补多少个0或者1呢?这要根据你要变的数据类型的长度与现在的数据类型的长度的bit差

2.长类型到短类型
规则是:将长类型比短类型多出的位从最高位开始截断
比如 :
short a=32767;//二进制是0111111111111111;
char b =(char)a;//把0111111111111111左边八位截掉然后再赋给b,因为b是个有符号的,所以当他看到截断后的11111111,认为这是个负数,
                //11111111就是补码,于是用补码来计算出他的十进制为-1

故输出结果是-1
如果改成
unsigned char b = (char) a; 
则把11111111是无符号的,直接用原码的方式计算出他的值是255

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值