- 打卡等级:常住居民III
- 打卡总天数:121
- 最近打卡:2025-05-01 19:17:52
已绑定手机
中级会员
- 积分
- 492
|
发表于 2023-7-9 09:29:18
|
显示全部楼层
关于C188警告的详细测试程序段, 按照指示添加并编译后就可以在KEIL C251中进行软件仿真测试(ctrl+F5):
显示强制类型转换操作 可以消除 C188 告警,但是使用者需要自己当心转换中数据截断操作是否满足自己的要求!
//将以下程序行添加到一个C251工程中的 main.c 中的 #include <xxx>之后,且是main()函数之外
//变量定义
u8 u8_i, u8_k;
u16 u16_k;
//函数声明
u8 add_x_y(u8 x);
u16 add1_x_y(u16 x);
//函数代码
u8 add_x_y(u8 x)
{
return(x+1);
}
u16 add1_x_y(u16 x)
{
return(x+1);
}
//将以下程序行添加到一个C251工程中的 main()函数中的 RSTFLAG |= 0x04; 之后
//测试 L188 的程序段
u8_i = 1;
u8_k = add_x_y(u8_i+1); //这里回产生 C188 编译警告, 是因为C251编译器默认是常数 1 为 双字节类型,而函数调用定义的参数类型是u8,存在数据截断,故产生警告!
//运行结果 u8_k =3 正确
u8_k = add_x_y((u8)(u8_i+1)); //这里对(u8_i+1)先行进行显式强制类型转换,则不会产生 C188 编译警告
//运行结果 u8_k =3 正确
u8_i = 1;
u16_k = add1_x_y(u8_i+0x1234L); //这里参数值相加后有效数值实际也是u16类型,不会产生数据字节的截断,则 不 会产生 C188 编译警告
//运行结果 u16_k =0x1236 正确
u16_k = add1_x_y(u8_i+0x12345678L); //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,存在数据截断,故产生 C188 警告!
//运行结果 u16_k =0x567A 正确
u16_k = add1_x_y((u16)(u8_i+0x12345678L)); //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,由于存在显式强制类型转换,则不会产生 C188 编译警告
//运行结果 u16_k =0x567A 正确
////
//END OF ALL |
|