Arduino 乘法,除法。怎么了?
简单的操作。计算时间延迟Arduino 乘法,除法。怎么了?,arduino,arduino-uno,Arduino,Arduino Uno,简单的操作。计算时间延迟 const unsigned long C1 = 30 * 1000; const unsigned long C2 = (300 * 1000)/C1; // must be = 10 void setup() { Serial.begin(57600); Serial.println("\n-------"); Serial.print("C1 = "); Serial.println(C1); Serial.print("C2 = "); Ser
const unsigned long C1 = 30 * 1000;
const unsigned long C2 = (300 * 1000)/C1; // must be = 10
void setup() {
Serial.begin(57600);
Serial.println("\n-------");
Serial.print("C1 = "); Serial.println(C1);
Serial.print("C2 = "); Serial.println(C2);
unsigned long V1 = (300 * 1000)/C1; // must be = 10
Serial.print("V1 = "); Serial.println(V1);
long V2 = (300 * 1000)/30000; // must be = 10
Serial.print("V2 = "); Serial.println(V2);
int V3 = (300 * 1000)/30000; // must be = 10
Serial.print("V3 = "); Serial.println(V3);
}
void loop() {
}
监视器控制台上打印的Arduino UNO:
- C1=30000(正常)
- C2=143164(必须为=10)
- V1=143164(必须为=10)
- V2=0(必须为=10)
- V3=0(必须为=10)
怎么了?300*1000预计将以十六进制形式给出30'0000,或0x493E0。 但是当您写入(300*1000)时,Arduino使用16位有符号整数算术,因此结果被截断为0x93E0(或十进制中的-27680) 然后除以无符号长时,结果将转换为无符号长,这将以十进制形式给出0xFFFF'93E0或4'294'939'616 除以30000,得到143'164
对于V2,它是相同的:(300*1000)=16位有符号算术中的-27680,-27'680/30'000给出0,300*1000预计给出30'0000,或十六进制中的0x493E0。 但是当您写入(300*1000)时,Arduino使用16位有符号整数算术,因此结果被截断为0x93E0(或十进制中的-27680) 然后除以无符号长时,结果将转换为无符号长,这将以十进制形式给出0xFFFF'93E0或4'294'939'616 除以30000,得到143'164 对于V2来说是相同的:(300*1000)=16位有符号算术中的-27680,-27'680/30'000给出0Hack
long V2=(300*1000UL)/30000代码>打印10
Hacklong V2=(300*1000UL)/30000代码>打印10