Domanda

voglio moltiplicare lunghi i numeri che sono dati in una base di 2 ^ 32. Ho già pensato di un bel algoritmo per farlo, ma purtroppo mi sono bloccato. La situazione mi sono bloccato a, è come lo faccio moltiplicare due lunghi int e rappresento in base 2 ^ 32.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef unsigned int uint32;
typedef unsigned long long uint64;
int main(int argc, char* argv[] )
{

  uint64 a = (uint64)ULONG_MAX;
  printf("%llu\n", a);
  uint64 b = (uint64)ULONG_MAX;  
  printf("%llu\n", b);  
  uint64 c = (uint64)(a*b);

  printf("%llu\n", c);  // prints 1. that would be to lower 32 bits of the results. the upper half is 0xFFFFFFFE

  printf("%llu\n", ULLONG_MAX);
  system("pause");
}

Perché ULLONG_MAX lo stesso di ULONG_MAX? Secondo http://en.wikipedia.org/wiki/Limits.h#Member_constants dovrebbe essere 18.446.744.073.709.551.615 I

Come si può vedere dai miei commenti, voglio il risultato del l'Multiplikation nei due uint32. Il lowerhalf sarebbe 0x1 e la metà superiore 0xFFFFFFFE. Come faccio ad avere questi valori?

(Ho trovato questa domanda su SO, ma non è utile nella mia situazione, perché le risposte date ar simile alle mie idee: moltiplicare due long long int C )

Modifica Il mio sistema è Windows XP a 32 bit. Sto usando gcc 3.4.2 (mingw-speciale)

L'output che si ottiene durante l'esecuzione del codice:

4294967295
4294967295
1
4294967295

Edit2:

  printf("%i\n", sizeof(unsigned long));
  printf("%i\n", sizeof(unsigned long long)); 

ritorna

4
8

Modifica 3: Grazie a Petesh sono stato in grado di trovare la soluzione:

  printf("%lu\n", c & 0xFFFFFFFF);
  printf("%lu\n", (c >> 32));
È stato utile?

Soluzione

Il suggerimento è nel sistema ( "pausa") - siete su Windows? Stampa di una lunga lunga utilizzando il runtime di Visual c Microsoft richiede l'utilizzo di '% I64u' (che è un capitale i).

Questo è basato su domanda SO Come si fa a printf un unsigned int lungo tempo (l'identificatore di formato per unsigned long int lungo)?

Altri suggerimenti

Non certo perché che stai ricevendo i risultati con il compilatore (non specificato), ma gcc sotto Ubuntu 10 dà:

4294967295
4294967295
18446744065119617025
18446744073709551615

con quelli ultimi due sono 0xfffffffe00000001 e (2 64 -1), rispettivamente, come volete.

Quindi, forse in considerazione il passaggio ad un up-to-date compilatore di più. Può essere che si sta utilizzando un compilatore pre-C99.

solo per interesse, che cosa fa sizeof (unsigned long) e sizeof (unsigned long long) darà sul sistema. Questo sarebbe un lungo cammino verso spiegare il problema.


Un paio di altre cose da controllare poiché i vostri sizeofs sembrano indicare i tipi di dati stessi sono a posto (anche se queste non possono risolvere il problema - sono stati trovati con un abbastanza superficiale ricerca sul web ):

  • Provare a usare "%I64u" come la stringa di formato, invece di "%llu". Se MinGW sta usando le librerie MSVCRT, che potrebbe essere necessaria per un reale sostegno printf a 64 bit.
  • Assicurarsi che si sta compilando con -std=c99.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top