- 打卡等级:以坛为家II
- 打卡总天数:494
- 最近打卡:2025-05-02 09:16:59
荣誉版主
- 积分
- 3480
|
发表于 2024-9-1 15:43:05
|
显示全部楼层
说说我对此话题的理解:
编译器C251和C51在语法检验的严格程度有所不同.
因此同样的语句在不同的编译环境下, 语法检查结果不同, 有的无警告, 有的有警告了...
不是因为传入了较大的数据类型. 而是因为传入的参数有可能超出定义的数据类型.
就以楼主实例看:
114 oledWriteCmd(col & 0xf);
115 oledWriteCmd(0x10 + (col >>4));
这是一个写命令字节的语句, 其中参数是一个字节(8位)数据类型,
114 句 col参数是字节型的, 它"与运算"0x0f 以后还是字节型, 所以这一句是不会警告的.
115 句 col参数是字节型的, 它右移4位以后还是字节型, 但是它再加上0x10(常数)以后, 就有可能超出字节类型, 所以会有警告出现.
如果同意是这样的道理的话, 那么解决的方法, 就不是改为较大的数据类型了.
而是应该是将参数经运算后的结果约束为一个函数原型中定义的类型即可.
就具体实例而言, 是将运算后的结果约束为字节类型,
则可改为:
115 oledWriteCmd((unsigned char)(0x10 + (col >>4)));
应该是不警告了.
其中红色部分是新增的字符, 如果unsigned char之前已经有过宏定义, 比如已定义为u8, 那么括弧内就写u8即可...
个人理解,仅供参考...
|
|