在涉及到不同数据类型之间的运算和赋值时,因为不同数据类型之间运算规则、精度表示和表示范围之间有区别,所以我们需要进行数据类型的转换。
相对应的,我们有隐式转换和显式转换
#include <stdio.h>
#include <stdint.h>
// 显式转换
int main()
{
uint32_t number_1 = UINT32_MAX;
int32_t number_2 = (int32_t)number_1; // 无符号转有符号(扩展大转小,在范围内不溢出就不会报错)
uint16_t number_3 = UINT16_MAX;
int32_t number_4 = (long long)number_3; // 小转大
int16_t number_5 = -5;
uint16_t number_6 = (uint16_t)number_5; // 负数转有符号整数
float number_7 = 16.07f;
printf("uint32的最大值:%u\n", number_1);
printf("转换后结果:%d\n", number_2); // 溢出,所以显示-1
printf("uint16的最大值:%u\n", number_3);
printf("转换后结果:%d\n", number_4); // 正常转换
printf("负数转有符号数:%u\n", number_5); // 负数转有符号会报错
printf("强制转换:%d\n", number_7); // 强制转换可能会报错
return 0;
}
隐式转换不做推荐,可读性不强,改bug能力弱。不推荐写隐式转换
#include <stdio.h>
#include <stdint.h>
// 隐式转换
int main()
{
uint32_t number_1 = UINT32_MAX;
int32_t number_2 = number_1;
uint16_t number_3 = UINT16_MAX;
int32_t number_4 = number_3;
int16_t number_5 = -5;
uint16_t number_6 = number_5; // 易读为赋值语句
float number_7 = 16.07f;
printf("uint32的最大值:%u\n", number_1);
printf("转换后结果:%d\n", number_2); // 溢出,所以显示-1
printf("uint16的最大值:%u\n", number_3);
printf("转换后结果:%d\n", number_4); // 正常转换
printf("负数转有符号数:%u\n", number_5); // 负数转有符号会报错
printf("强制转换:%d\n", number_7); // 强制转换可能会报错
return 0;
}
在进行不同数据类型之间的转换时,可能会出现丢失精度的情况。例如float转为int,小数部分会被丢弃。