许昌市住房和城乡建设部网站南宁网站建设服务公司
1-1 数据类型转换
在C语言中,数据类型转换(也称为类型铸造或类型转换)是一个重要的概念,它允许你将一种数据类型的值转换为另一种数据类型。然而,在进行类型转换时,有一些关键点和注意事项需要牢记,以避免潜在的错误和不正确的结果。以下是一些主要的数据类型转换注意事项:
1.0 隐式转换
隐式类型转换(自动转换):
在表达式中,char
、short
等小整型会被自动提升为int
或unsigned int
,可能导致符号扩展问题
#include <stdio.h>int main() {char ch = 'A'; // ASCII value of 'A' is 65int i = ch; // Implicit conversion from char to intprintf("i = %d\n", i); // Output: i = 65return 0;
}
示例:浮点提升
#include <stdio.h>int main() {int a = 5;double b = 2.5;double result = a + b; // Implicit conversion of 'a' to doubleprintf("result = %lf\n", result); // Output: result = 7.500000return 0;
}
2.0 显式类型转换(强制转换)
示例:浮点转整数(精度丢失)
#include <stdio.h>int main() {float f = 3.99f;int i = (int)f; // Explicit conversion, fractional part is lostprintf("i = %d\n", i); // Output: i = 3return 0;
}
浮点数转化为小数会把小数部分全部截断,然后小数部分省略掉
示例:溢出风险
#include <stdio.h>int main() {unsigned short us = 65535; // Maximum value for unsigned shortus = us + 1; // Overflow occurs, us becomes 0printf("us = %u\n", us); // Output: us = 0return 0;
}
示例:指向不同类型指针的转换(不推荐)
#include <stdio.h>int main() {int x = 10;void *vp = &x;int *ip = (int*)vp; // Explicit conversion from void* to int*printf("*ip = %d\n", *ip); // Output: *ip = 10// Attempting to dereference incorrectly can lead to undefined behaviorchar *cp = (char*)vp;printf("*cp = %d\n", *cp); // Behavior depends on system's endiannessreturn 0;
}
3.0 结构体和联合体
示例:结构体成员访问(无直接转换)
#include <stdio.h>struct Point {int x;int y;
};int main() {struct Point p = {10, 20};int *ptr = (int*)&p; // Accessing members through pointer arithmetic (not recommended)printf("x = %d, y = %d\n", ptr[0], ptr[1]); // Output: x = 10, y = 20return 0;
}
示例:联合体的特殊性
#include <stdio.h>union Data {int i;float f;
};int main() {union Data data;data.i = 123456;printf("data.i = %d, data.f = %f\n", data.i, data.f); // Output depends on representationreturn 0;
}
4.0 浮点数与整数的转换
示例:整数转浮点数
#include <stdio.h>int main() {int i = 100;float f = (float)i; // Conversion from int to floatprintf("f = %f\n", f); // Output: f = 100.000000return 0;
}
5.0 常量表达式的转换
示例:整数常量默认类型
#include <stdio.h>int main() {long l = 2147483648; // This value exceeds the range of int, so it's treated as longprintf("l = %ld\n", l); // Output: l = 2147483648return 0;
}
示例:浮点常量默认类型
#include <stdio.h>int main() {float f = 3.14f; // Specifying 'f' suffix makes it a floatdouble d = 3.14; // Without suffix, it's treated as double by defaultprintf("f = %f, d = %lf\n", f, d); // Output: f = 3.140000, d = 3.140000return 0;
}
......