C语言各种类型之间转换详解 |
您所在的位置:网站首页 › c语言中的类型转换有几种 › C语言各种类型之间转换详解 |
目录
1. C基本类型变量2. 符号扩展2.1 规则一:2.2 规则二:2.3 规则三:
3. 零扩展4. 长类型转换为短类型5. 自动类型转换5.1 赋值时的类型转换5.2 运算时的类型转换
6. 有符号和无符号数的比较6. 无符号数回绕参考资料:
1. C基本类型变量
char/short/int/long/long long 以及其对应的无符号类型,short/double等。 基本类型输出格式符char%c, %d, %ushort%hdint%dlong%ldlong long%lldunsigned char%c, %d, %uunsigned short%hu, %ho, %hxunsigned int%u, %o, %xunsigned long%lu, %lo, %lxunsigned long long%llu, %llo, %llxfloat%fdouble%lf在类型转换中,根据待转换的类型划分,可分为对有符号类型的转换和无符号类型的转换,对应的转换规则为符号扩展和零扩展。 2. 符号扩展即,对于要扩展的量为有符号数,扩展存储位数的方法。 2.1 规则一:在新的高位字节使用当前当前最高有效位即符号位的值进行填充。 例1: char a = 0xff; // 有符号值为 -1,二进制为 1111 1111,其中最高位为符号位 short b = a; // b的有符号值为 -1,在内存中存储的值为 1111 1111 1111 1111例2: char a = 1; // 有符号值为 1,二进制位 0000 0001,其中最高位为符号位 short b = a; // 有符号值为 1,在内存中存储的值为 0000 0000 0000 0001 2.2 规则二:对于同一长度的数据类型中有符号与无符号数的相互转化,直接将内存中的数据赋给要转化的类型,数值大小会发生变化。 例3: char a = 0xff; // 有符号值为 -1,二进制为 1111 1111,其中最高位为符号位 unsigned char b = a; // 无符号值为 255,在内存中存储的值仍为 1111 1111,最高位为数据位 2.3 规则三:对于短类型扩展为长类型时,若短类型与长类型分属于有符号数与无符号数,则先按规则一进行类型的扩展,再按规则二直接将内存中的数值原封不动的赋给对方(若短类型与长类型分属于无符号数与有符号数,则先按下一节中零扩展规则进行扩展,再执行规则二)。 例4: char a = 0xff; // 有符号值为 -1,二进制为 1111 1111,其中最高位为符号位 unsigned short b = a; // 按规则一,扩展为 short 类型: 1111 1111 1111 1111,有符号值为 -1 // 再按规则二,扩展为 unsigned short 类型:1111 1111 1111 1111,无符号值为 2^16 - 1 3. 零扩展即,对于要扩展的量为无符号数,扩展存储位数的方法。 在新的高位直接填 0。若扩展类型从无符号短类型到有符号长类型,则首先由无符号短类型扩展为无符号长类型,再由无符号长类型转化为有符号长类型。 例1: unsigned char a = 0xff; // 无符号值为 255,二进制为 1111 1111 unsigned short b = a; // b 经过零扩展后,无符号值为 255,内存中存储的值为 0000 0000 1111 1111例2: unsigned short i = 65535; printf("%d\n", i); // 65535,零扩展:0xffff(ushort) -> 0x0000ffff(uint) -> 0x0000ffff(int) signed short i = 65535; printf("%d\n", i); // -1,符号扩展:0xffff(short) -> 0xffffffff(int) 4. 长类型转换为短类型对于长数据类型缩减为短数据类型的情况,会直接截取低字节赋给短数据类型。 例2: unsigned short a = 0x55ff; // 无符号值,二进制为 0101 0101 1111 1111 char b = a; // 有符号值为 -1,二进制为 1111 1111 5. 自动类型转换自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。 5.1 赋值时的类型转换将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如: float f = 100;100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如: int n = f;f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。 5.2 运算时的类型转换在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下: 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算;所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算;char 和 short 参与运算时,必须先转换成 int 类型。不同类型运算时,类型转换原则如下图: 6. 有符号和无符号数的比较有符号数与无符号数运算时数强制类型转换方式: 当执行一个运算时(如下面的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号参数强制类型为无符号数,并假设这两个数都是非负的,来执行这个运算。 #include int main() { int a = -1; unsigned int b = 1; if(a > b) printf("a > b, a = %d, b = %u\n", a, b); else printf("a |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |