program memory math strange behavior

Hello,
I have a simple sketch that I would like to use a combination of program memory and RAM to perform math. The result is incorrect and I don't see why yet. Any ideas?

#include <avr/pgmspace.h>

void setup() {

  Serial.begin(115200);  
  static prog_uint16_t NUM1024 PROGMEM=1024;
  uint8_t index=71;
  uint32_t mult=index*pgm_read_word_near(&NUM1024);

  Serial.write("index=");
  Serial.println(index);
  Serial.write("NUM1024=");
  Serial.println(pgm_read_word_near(&NUM1024));
  Serial.write("mult=");
  Serial.println(mult);
  Serial.write("result should be 71*1024=72704\n");
}

void loop() {
}

result:

index=71
NUM1024=1024
mult=7168
result should be 71*1024=72704

uint32_t mult = index * (uint32_t) pgm_read_word_near( & NUM1024 );

...or...

uint32_t mult = (uint32_t) index * pgm_read_word_near( & NUM1024 );

...or...

uint32_t mult = (uint32_t) index * (uint32_t) pgm_read_word_near( & NUM1024 );

THANKS!!!

is this only needed for 32bit math? I never have had to do this when all constants and variables were 16bits or lower

AVR-GCC is essentially a compiler for a 16 bit processor; int is 16 bits. That means all expressions less than 16 bits are automatically promoted to 16 bits. For expressions that are expected to have a 32 bit result and start with 16 bit operands you, the developer, are responsible for the promotion.