使用预处理器定义的计算产生不正确的值

Calculation with preprocessor-defines yields incorrect value

我很确定这是初学者常犯的错误,但我不知道找到现有答案的正确词语。

我已经定义了一些连续的预处理器宏:

#define DURATION        10000
#define NUMPIXELS       60
#define NUMTRANSITION   15
#define UNITS_PER_PIXEL 128
#define R   ((NUMPIXELS-1)/2 + NUMTRANSITION) * UNITS_PER_PIXEL

稍后我使用这些值来计算一个值并将其分配给一个变量。这里有两个例子:

// example 1
uint16_t temp;    // ranges from 500 to 10000
temp = 255 * (temp - 500) / (10000 - 500);

在这里,temp 始终是 0。由于我猜测 was/is 数据类型有问题,我也尝试了 uint32_t temp。但是,在这种情况下,temp 总是 255

// example 2
uint32_t h = millis() + offset - t0 * R / DURATION;

millis() returns 递增的 unsigned long 值(自开始以来的毫秒数)。这里,h 增加了 4 倍太快了。 unsigned long h 也一样。当我尝试除以 4*DURATION 的变通方法时,h 总是 0.

是数据类型问题吗?如果没有,我该如何解决?

此代码按预期适用于 Arduino Uno 和 ESP32

    #define DURATION        10000
    #define NUMPIXELS       60
    #define NUMTRANSITION   15
    #define UNITS_PER_PIXEL 128
    #define R   ((NUMPIXELS-1)/2 + NUMTRANSITION) * UNITS_PER_PIXEL
    uint32_t t0 = millis();

    void setup() {
      // put your setup code here, to run once:
      Serial.begin (115200);
      //Later I use these values to calculate a value and assign it to a variable. Here two examples:

      // example 1

      randomSeed(721);
    }

    void loop() {
     // For UNO /ESP use uint16_t temp = random(500,10000);    // ranges from 500 to 10000
     // for ATtiny85 (DigiSpark)
    uint32_t temp = random(500,10000);    // ranges from 500 to 10000
      temp = 255 * (temp - 500) / (10000 - 500);

      // Here, temp is always 0. Since my guess was / is an issue with the datatype, I also tried uint32_t temp. However, temp was always 255 in this case.

      // example 2
      Serial.println(temp);
      uint16_t offset = random(2000, 5000);
      uint32_t h = millis() + offset - t0 * R / DURATION;
      Serial.println(h);
    delay (5000); // Only to prevent too much Serial data, never use in production
    }

环境 ArduinoIDE 1.8.12/avr 核心 1.8.2 和 ESP32 1.04。
你编译到什么硬件?尝试测试程序,它(至少在被测试的硬件上)做了它应该做的。 编辑:作为参考,OP 使用 Attiny85 (Digispark),其中 var size defs 比 UNO /ESP 更重要 - 而不是 Serial,您将使用 SerialUSB。
给未来支持请求者的提示 -> 由于可能存在硬件特定问题,请始终参考您的微控制器环境(硬件和软件)