C语言中类型转化的原理

    技术2022-07-31  71

    C语言中类型转化的原理

    类型转化(为了便于硬件的实现)1. 强制类型转换2. 隐式类型转换(1)运算转换(2)赋值类型转换(3)输出类型转换(4)函数调用转换 3.讨论(1)赋值类型转换和字符串知识点(2)输出类型转化、符号扩充及结构体位域知识点

    类型转化(为了便于硬件的实现)

    1. 强制类型转换

    一般形式:(类型名)(表达式) 例:

    double x = 2.1, y-= 1.2; (int)(x +y); //3 (int)x + y; //3.200000 (double)(3 / 2); //1.000000 (int)3.6; //3

    2. 隐式类型转换

    (1)运算转换

    不同数据类型数据混合运算,先转换为同一类型(转换按数据长度增加的方向进行,以保证精度不降低。),再进行运算; 数据类型级别(从低到高排列): char<short<unsigned short<int<unsigned int<long<unsigned long<float<double

    #include <stdio.h> void foo(void) { int a = -20; unsigned int b = 2; (a+b>0)? puts(">0"):puts("<0"); //输出>0 } int main() { foo(); return 0; }

    (2)赋值类型转换

    赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边变量量的类型。(注:赋值号左边只能是变量) A.小数据赋给大变量 不会造成数据丢失,系统为了保证数据的完整性,还提供了符号扩充行为(若符号位为0,高位全部补0;若符号位为1.高位全部补1)。

    #include <stdio.h> int main() { char a = 0xff; //1111 1111 a = 0x7f 注意:十六进制不能表示正负的 int b = a; //1111 1111 1111 1111 1111 1111 1111 1111 printf("%d\n", b); return 0; }

    B.大数据赋给小变量 会发生截断行为,造成数据丢失。

    #include <stdio.h> int main() { int a = 0xff; //255 char b = a; //-1 printf("%d\n", b); return 0; } ``

    (3)输出类型转换

    输出的转换成指定的输出格式 输出类型转换规则: A.printf把char、short提升为int型,在传给printf B.float提升到double类型再传给printf

    #include <stdio.h> int main() { char b = 0xff; //b = 0x8f 输出ffffff82 符号扩充输出 printf("%x\n", b); //输出fffffff return 0; }

    (4)函数调用转换

    函数实参和形参类型需保持一致不做讨论。一般函数的形参和函数返回值类型不一致,函数形参的类型会转为函数返回值的类型。

    #include <stdio.h> int foo(double x, double y) { return x + y; } int main() { double x = 2.1, y = 1.2; //printf("%lf\n", foo(x, y)); 警告 输出0.000000 printf("%d\n", foo (x, y)); //3 return 0; }

    3.讨论

    (1)赋值类型转换和字符串知识点

    #include <stdio.h> #include <string.h> int main() { char a[1000]; int i; for(i=0; i<1000; i++) { a[i] = -1 - i; //赋值类型转换 } printf("%d\n", strlen(a)); return 0; }

    运行结果:255

    strlen函数返回的是字符串的个数,不包括’\0’结束符。

    (2)输出类型转化、符号扩充及结构体位域知识点

    #include <stdio.h> int main() { typedef struct { int a:2; int b:2; int c:1; } test; test t; t.a = 1; //01 t.b = 3; //11 t.c = 1; //1 printf("%d",t.a); printf("%d",t.b); printf("%d",t.c); printf("\n"); return 0; }

    运行结果: 1 -1 -1

    Processed: 0.009, SQL: 9