I'm getting very wrong math in one instance using a casting, negative numbers and a division. If I don't do any 1 of those three things it works fine. This is with an atxmega32a4 using both the atmel avr-gcc 4.5.1 (avr-gcc (AVR_8_bit_GNU_Toolchain_3.2.3_314) 4.5.1) as well as 4.5.1 gcc built with the script from AvrFreaks. The code snippet to demonstrate this is:
int16_t var1_16, var2_16, var3_16; int32_t var1_32, var2_32; var1_16 = pcpv_data->board.vout; var2_16 = -48; var3_16 = ((int32_t)var1_16 * (int32_t)var2_16) / 10; printf("WRONG: using casting : %d = ( %d * %d) / 10\n",var3_16, var1_16, var2_16); var1_16 = -pcpv_data->board.vout; var2_16 = 48; var3_16 = ((int32_t)var1_16 * (int32_t)var2_16) / 10; printf("RIGHT: using casting, positive vars : %d = ( %d * %d) / 10\n",var3_16, var1_16, var2_16); var1_16 = pcpv_data->board.vout; var2_16 = -48; var3_16 = ((int32_t)var1_16 * (int32_t)var2_16); printf("RIGHT: using casting, without the division : %d = ( %d * %d)\n",var3_16, var1_16, var2_16); var1_16 = -32; var2_16 = -48; var3_16 = ((int32_t)var1_16 * (int32_t)var2_16) / 10; printf("RIGHT: using casting, assigned from constant: %d = ( %d * %d) / 10\n",var3_16, var1_16, var2_16); var1_32 = pcpv_data->board.vout; var2_32 = -48; var3_16 = (var1_32 * var2_32) / 10; printf("RIGHT: using int32_t vars : %d = ( %ld * %ld) / 10\n",var3_16, var1_32, var2_32); With a result of this: WRONG: using casting : 13260 = ( -32 * -48) / 10 RIGHT: using casting, positive vars : 153 = ( 32 * 48) / 10 RIGHT: using casting, without the division : 1536 = ( -32 * -48) RIGHT: using casting, assigned from constant: 153 = ( -32 * -48) / 10 RIGHT: using int32_t vars : 153 = ( -32 * -48) / 10 A section of the .lst file is here: http://pastebin.com/AMX2Mr75 thanks, Paul _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list