以下Arduino的(C++)代碼C++模數需要在兩個* un *符號字節之間進行減法運算,爲什麼?
void setup()
{
Serial.begin(115200);
byte b1 = 12;
byte b2 = 5;
const byte RING_BUFFER_SIZE = 64;
byte diff = b2 - b1;
byte diff2 = (byte)(b2 - b1) % RING_BUFFER_SIZE; //<---NOTE HOW THE (byte) CAST IS *REQUIRED* TO GET THE RIGHT RESULT!!!!
Serial.println(b1);
Serial.println(b2);
Serial.println(RING_BUFFER_SIZE);
Serial.println(diff);
Serial.println(diff2);
}
void loop()
{
}
產生預期:
12
5
64
249
57 //<--correct answer
而沒有 「(字節)」 鑄造如下所示:
void setup()
{
Serial.begin(115200);
byte b1 = 12;
byte b2 = 5;
const byte RING_BUFFER_SIZE = 64;
byte diff = b2 - b1;
byte diff2 = (b2 - b1) % RING_BUFFER_SIZE; //<---(byte) cast removed
Serial.println(b1);
Serial.println(b2);
Serial.println(RING_BUFFER_SIZE);
Serial.println(diff);
Serial.println(diff2);
}
void loop()
{
}
它產生:
12
5
64
249
249 //<--wrong answer
爲什麼區別?爲什麼模運算符只能使用顯式類型轉換?
注: 「字節」= 「uint8_t」
另請參閱:整數促銷 – milleniumbug
我會研究它。你是否看到完全預期的行爲?還是它一直困擾程序員? –
你能告訴我們沒有代碼請你。 –