【嵌入式C】强制类型转换

类型转换:
  低转高:延拓,最高位填充;
  高转低:截断
  直接使用强制类型转换并不能去掉符号

同等长度变量之间的类型转换

同样长度的不同类型相互转换时,比方 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。

你可能感兴趣的:(嵌入式C,c语言,开发语言)