C语言隐式类型转换

//引言

近日笔者在学习C语言过程中意识到了隐式类型转换的重要性,故学习了解相关知识,用此文记录。

//数据类型级别

数据类型级别高低

//什么是隐式类型转换

 在没有写 (type) 强制转换的情况下,编译器自动进行的一种类型转换行为。

例如:

int a = 3;

double b = a; 

此时,因为double类型的转换优先级高于int,变量a在b的赋值运算时,会被自动转换为double类型。

//整型提升

这是 C 语言中最常见的隐式转换。

▶ 规则:

所有比 int 小的类型:

char , unsigned char , short , unsigned short

在运算时会 自动提升为 int 或 unsigned int。

例如:

char a = 5;

char b = 6;

char c = a + b; // a、b 都先提升为 int,再做运算

a+b 的类型是 int,不是 char。

⚠ 可能导致溢出或精度问题:

char x = 120;

char y = 10;

char z = x + y; // 120+10=130,溢出到 char 范围

//运算中的隐式类型转换

当表达式中出现不同类型时,C 会进行自动提升:

▶int + double

int a = 10;

double b = 3.5;

double c = a + b; // a -> double

▶ float + double

float x = 1.2f;

double y = 2.3;

double z = x + y; // x -> double

▶unsigned + signed 

unsigned int a = 5;

int b = -20;

printf(“%d\n”, a + b);

b 会自动转成 unsigned,变为极大正数

//赋值时的隐式类型转换

▶ double -> int

double a = 3.14;

int b = a; // 小数部分丢失

//常见问题

① 表达式中参与除法

printf(“%f”, 5/2);

两个都是 int → 计算结果是 int → 2
最后转为 double → 2.000000

不丢精度的写法应为:

printf(“%f”, 5/2.0);  // 2.500000

② char 溢出

char c = 130;
printf(“%d\n”, c);   // -126(有符号 char 溢出)

③ uint 与 int 混算

unsigned int a = 100;
int b = -200;

printf(“%d\n”, a+b);  // b 转无符号 → 巨大正数

//总结

显然,隐式类型转换并不是一个优秀的写法。在使用中应该避免隐式类型转换,多用显示类型转换。

另外,如今大多数的编译器在编译时,都会warning隐式类型转换。

在coding时应该养成避免这种写法的好习惯。

 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注