在 Arduino Uno 上运行的这段代码会打印递增的数字,并按预期从 32767 回绕到 -32768。
int16_t i = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
i++;
Serial.println(i);
}
Run Code Online (Sandbox Code Playgroud)
然而,人们认为在功能上等效的这段代码不断打印超过 200000 个 16 位数字(有符号或无符号)应该能够表示的数字。
void setup() {
Serial.begin(115200);
int16_t i = 0;
while(true) {
i++;
Serial.println(i);
}
}
void loop() {}
Run Code Online (Sandbox Code Playgroud)
Arduino 参考中有关于数据类型的注释/警告int
。这有关系吗?
当有符号变量超过其最大或最小容量时,它们就会溢出。溢出的结果是不可预测的,因此应该避免这种情况。溢出的典型症状是变量从最大容量“滚动”到最小容量,反之亦然,但情况并非总是如此。如果您想要这种行为,请使用 unsigned int。
第二个代码片段发生了什么?变量如何明显代表这么大的数字而不滚动?