1-1 数据类型转换
在C语言中,数据类型转换(也称为类型铸造或类型转换)是一个重要的概念,它允许你将一种数据类型的值转换为另一种数据类型。然而,在进行类型转换时,有一些关键点和注意事项需要牢记,以避免潜在的错误和不正确的结果。以下是一些主要的数据类型转换注意事项:
1.0 隐式转换
隐式类型转换(自动转换):
在表达式中,char
、short
等小整型会被自动提升为int
或unsigned int
,可能导致符号扩展问题
#include <stdio.h>
int main() {
char ch = 'A'; // ASCII value of 'A' is 65
int i = ch; // Implicit conversion from char to int
printf("i = %d\n", i); // Output: i = 65
return 0;
}
示例:浮点提升
#include <stdio.h>
int main() {
int a = 5;
double b = 2.5;
double result = a + b; // Implicit conversion of 'a' to double
printf("result = %lf\n", result); // Output: result = 7.500000
return 0;
}
2.0 显式类型转换(强制转换)
示例:浮点转整数(精度丢失)
#include <stdio.h>
int main() {
float f = 3.99f;
int i = (int)f; // Explicit conversion, fractional part is lost
printf("i = %d\n", i); // Output: i = 3
return 0;
}
浮点数转化为小数会把小数部分全部截断,然后小数部分省略掉
示例:溢出风险
#include <stdio.h>
int main() {
unsigned short us = 65535; // Maximum value for unsigned short
us = us + 1; // Overflow occurs, us becomes 0
printf("us = %u\n", us); // Output: us = 0
return 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 behavior
char *cp = (char*)vp;
printf("*cp = %d\n", *cp); // Behavior depends on system's endianness
return 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 = 20
return 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 representation
return 0;
}
4.0 浮点数与整数的转换
示例:整数转浮点数
#include <stdio.h>
int main() {
int i = 100;
float f = (float)i; // Conversion from int to float
printf("f = %f\n", f); // Output: f = 100.000000
return 0;
}
5.0 常量表达式的转换
示例:整数常量默认类型
#include <stdio.h>
int main() {
long l = 2147483648; // This value exceeds the range of int, so it's treated as long
printf("l = %ld\n", l); // Output: l = 2147483648
return 0;
}
示例:浮点常量默认类型
#include <stdio.h>
int main() {
float f = 3.14f; // Specifying 'f' suffix makes it a float
double d = 3.14; // Without suffix, it's treated as double by default
printf("f = %f, d = %lf\n", f, d); // Output: f = 3.140000, d = 3.140000
return 0;
}
......