fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. typedef union {uint16_t u; int16_t s;} container16;
  5. typedef union {uint32_t u; int32_t s;} container32;
  6.  
  7. int32_t imul(int16_t x, int16_t y) {
  8. container16 x1, y1;
  9. container32 z1;
  10. x1.s = x;
  11. y1.s = y;
  12. z1.u = x1.u * y1.u - (1uL<<16)*(y1.u*(x1.s<0)+x1.u*(y1.s<0));
  13. return z1.s;
  14. }
  15.  
  16. int main() {
  17. printf("7 * 8 = %d\n", imul(7, 8));
  18. printf("-7 * 8 = %d\n", imul(-7, 8));
  19. printf("7 * -8 = %d\n", imul(7, -8));
  20. printf("-7 * -8 = %d\n", imul(-7, -8));
  21. return 0;
  22. }
  23.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
7 * 8 = 56
-7 * 8 = -56
7 * -8 = -56
-7 * -8 = 56