MikroC中PIC单片机Write_SPI_32函数位运算结果异常排查
位运算错误原因及修复方案
你的问题出在整数溢出与默认类型宽度上,在MikroC针对PIC单片机的编译环境中,默认int类型为16位(适配多数8/16位PIC架构),而你使用的十进制字面量(如2、120、160)会被编译器默认识别为int类型,直接参与位运算时会触发溢出问题。
具体错误点:
(2 << 30):2作为16位int,左移30位远超其存储范围,触发未定义行为,结果完全偏离预期的0x80000000。(120 << 21):120作为16位int,左移21位同样溢出,计算结果错误。(160 << 12):160左移12位后值为655360,超过16位int的最大值32767,同样溢出导致结果异常。
修复方案:
给每个参与位运算的字面量加上UL后缀,显式声明为unsigned long类型,确保运算在32位宽度下执行:
Write_SPI_32(0x300000 + 12, (2UL << 30) | (120UL << 21) | (160UL << 12));
验证结果:
2UL <<30=0x80000000120UL <<21=0x0F000000160UL <<12=0x000A0000
三者按位或后得到0x8F0A0000,与你前几个正确调用的参数值完全一致,即可得到预期结果。
内容的提问来源于stack exchange,提问作者MickeyReilley
相关产品推荐
相关产品推荐

