以下代码在CodeBlocks编译器上运行良好,但在MPLAB C18编译器上我得不到相同的结果。我正在使用PIC18单片机。
代码
int d[6];
int all;
d[0] = 6;
d[1] = 4;
d[2] = 8;
d[3] = 0;
d[4] = 0;
all = 10000*d[0] + 1000*d[1] + 100*d[2] + 10*d[3] + d[4];
printf("%d", all);
CodeBlocks上的输出:64800
MPLAB上的输出: - 816
究竟是什么问题?这段代码不应该正常吗?谢谢!
答案 0 :(得分:2)
具有int
类型的对象无法保证能够存储超出-32767
或32767
的值。你的Code :: Blocks实现恰好扩展了这个范围,但是你的MPLAB C18实现(顺便说一下,它实际上不是一个有效的C实现)。由于有符号整数溢出,您在MPLAB实现中看到的是未定义的行为。使用unsigned
类型和/或更广泛的类型,例如long
或long long
。不要忘记相应地修改printf格式说明符。 %u
为unsigned int
,%ld
为long
,%lu
为unsigned long
,%lld
为long long
,等等。 ..
答案 1 :(得分:0)
根据此link,您的MCU是8位系统。所以你的系统整数的长度是16位。当您使用 CodeBlocks 模拟代码时,您使用32位系统(或64位系统)运行代码,整数大小为32位。所以你不会得到相同的结果。因为在你的MPLAP系统中你会溢出整数大小