强制类型转换的符号位问题

做了几个小实验,是Linux下写的程序,用g++编译后运行,得出了这么个结论:


前提假设:两个整型类型分别是typeA和typeB,且bit(typeA)<bit(typeB) ,即,typeA的字长比typeB的字长 短


结论1

把typeA强制转化成为typeB类型(短到长),会把typeA的所有bit(包括最高位)拷贝到typeB的低位部分,而typeB的高位空余bit(如果有的话)用0或1填充,填充规则:若typeA的数是一个正数,则用0填;若是负数,就用1填。这里的正和负,指的是数值上的正和负,并不是取决于最高位,因为unsigned型正数的最高位也可以是1,如例2。


结论2

反过来,把typeB强制转化成为typeA类型(长到短),若typeA是K个bit(包括最高位),则把typeB的低K位原封不动拷贝到typeA,而typeB高位剩余的bit被舍弃


另:对于typeA和typeB字长相等的状况,结论1和结论2都适用


结论1举例:

例1:

char c = -86;

unsigned int b = c;//b的值是4294967210

b = -86//b仍然是4294967210,这是一个int到unsigned int的等字长转换


例2:

unsigned char c = 255;

int b = c;//b仍然是255


结论2举例:

例3:

char c = 0xaa;// c实际上是-86,这是一个unsigned int 到 char的强制转换,0xaa在unsigned int中的补码是000...000010101010,而它的低8位正好是char型的-86的补码

int b = c; //b是-86

usigned int bb = c; //bb是4294967210,这是参照例1中给出的结果


例4:

unsigned short s = -256;//s实际上是65280

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值