类型转换:
低转高:延拓,最高位填充;
高转低:截断
直接使用强制类型转换并不能去掉符号。
同等长度变量之间的类型转换
同样长度的不同类型相互转换时,比方 shortshort 强制转换成 unsigned shortunsigned short。实际在转换过程中,转换后的 unsigned shortunsigned short 与原来的 shortshort 在计算机中的二进制表示形式一样的,改变的只不过是解释他们的方式。
强制类型转换结果保持位值不变,只是改变了解释这些位的方式。
short a = -4321;
unsigned short ua = (unsigned short)a; // 这里进行强制类型转换 ua的真值是61215
不同长度变量之间的类型转换
长字长变量向短字长变量的转换
系统把多余的高位字长部分直接截断,低位直接赋值。
u16 exmple = 1000 0000 1111 0000;
u8 res;
res = (u8)exmple;
//res的值就是1111 0000
短字长变量向长字长变量的转换,高位部分还会扩展为原数字的符号位
短字长转向长字长,不仅是相应的位值相等,高位部分还会扩展为原数字的符号位;
负数的处理
关于负数的二进制问题:负数我们用的补码
,原码
取反变反码
,反码加1变成补码.
比如1 是0000 0001
-1的原码:1000 0001
反码:1111 1110
补码:1111 1111
而-1使用的时候为1111 1111
那么如果把char型的-1强制转换成无符号的unsigned char结果就是1111 1111解释为255了。
强制类型转换结果保持位值不变,只是改变了解释这些位的方式。
那么如果把char型的-1强制转换成无符号的unsigned short结果就是1111 1111 1111 1111解释为65535了。
高位部分还会扩展为原数字的符号位!
直接使用强制类型转换并不能去掉符号
代码中使用int32 类型 将值十进制值2147483648(0x8000 0000)赋值给uint64类型,在int32类型的二进制中,最高位为1,表示为补码。由Int32赋值给uint64类型的过程中,有两个过程:①将int32升级为int64,此时多出来的最高位全部补1,此时变成了0xffffffff80000000;②,将int64转化为uint64,此时十进制值为18446744071562067968。因此该值远大于2147483648。