//当无符号整数强制转,则高位字节被丢弃
unsigned short a =0xabcd; //0x0022FA80 cd ab cc cc
unsigned char b =(unsigned char)a;//0x0022FA77 cd cc cc cc b =0xcd 高位字节0xab 被丢弃
//当窄类型向宽类型赋值时,宽类型有存够的字节来容纳,则不会有任何问题。
unsigned char c =0xcd;
unsigned short d =c;
short d1 =c;
//当类型无符号整型转换成有符号整型时。当整数小于0x8000时,可以转换。当大于等于0x8000时,强制转换则变成负数。
unsigned short us1=0x8000;//us1 = 32768
short s1=(short)us1 ;//s1 = -32768
unsigned short us2=0x8001;//us2 = 32769
short s2=(short)us2; //s2 = -32767
//当有符号类型赋值给无符号类型时,当在正数范围,则可以转换。当为负数,则变为一个很大的数。
short n1 =-1; //0x0038FE04 ff ff cc cc n1 = -1
unsigned short us3 =n1; //0x0038FDF8 ff ff cc cc us3 = 65535
//整数与浮点数之间关系
//浮点数使用 IEEE(电气和电子工程师协会)格式。 浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 excess-127 二进制指数和一个 23 位尾数。
// 尾数表示一个介于 1.0 和 2.0 之间的数。 由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。
// 此表示形式为 float 类型提供了一个大约在 3.4E–38 和 3.4E+38 之间的范围。
unsigned int i =0x1000001;
float f1=(float)i;
unsigned int i1 =0x40001;
float f2=(float)i1;
//float只能存在unsigned int 和int 的部分。相反也是,超过23bit就会导致错误。
unsigned int i2= 0x800001;
float f3=(float)i2;
//总结 这些强制转换都是在无符号整数(原码),有符号整数(补码),以及float 浮点数在位模式上的转换。内存内容不变,只是解码二进制方式不同造成的。
C/C++ 内置类型转换注意点
最新推荐文章于 2023-02-02 16:06:23 发布