Comment multiplier des entiers 32 bits en c

Exécution de:

#define HIGH32(V64) ((uint32_t)((V64 >> 32)&0xffFFffFF)) #define LOW32(V64) ((uint32_t)(V64&0xffFFffFF)) uint32_t a = 0xffFFffFF; uint32_t b = 0xffFFffFF; uint64_t res = a * b; printf("res = %08X %08X\n", HIGH32(res), LOW32(res)); 

Donne:

 "res = 00000000 00000001" 

Mais j’attends: fffffffe00000001. Qu’ai-je fait de mal? Une seule mission:

 res = 0x0123456789ABCDEF; printf("res = %08X %08X\n", HIGH32(res), LOW32(res)); 

Donne

 res = 01234567 89ABCDEF 

Environnement:

 $gcc --version gcc (GCC) 4.8.3 Copyright (C) 2013 Free Software Foundation, Inc. $ gcc -v COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.8.3/lto-wrapper.exe dest arch: i686-pc-cygwin $ file a.exe a.exe: PE32 executable (console) Intel 80386, for MS Windows 

    Vous avez actuellement:

     uint64_t res = (uint32_t) a * (uint32_t) b; 

    Vous voudrez promouvoir les arguments en nombres 64 bits avant la multiplication. Donc:

     uint64_t res = (uint64_t) a * b;