2012-09-27 6 views
0

Je suis hésitant à poster mon code parce que c'est pour une tâche d'école, mais fondamentalement je dois itérer par un uint64_t qui peut être très grand. Par conséquent, j'ai une valeur qui peut être de 10 caractères environ. Il était à l'origine un int, et le code fonctionne partiellement (mais ne finit pas de créer la sortie à laquelle il est supposé), mais j'obtiendrais l'erreur "warning: integer constant is so large that it is unsigned".Exception de virgule flottante ET avertissement de constante trop important?

Je changerais alors cela int en uint64_t (il est multiplié par 10), et il me donnerait une exception de virgule flottante.

Un aperçu sans le code?

EDIT: Ajout de petits morceaux de code ...

uint64_t number = 1U; 

... 

for (int x = 0; x < y; x++) { 
    number *= 10; 
} 

^cela me donne l'exception à virgule flottante.

Vous ne savez pas si cela est suffisant pour être utile.

+0

nous montrent code pour nous aider à trouver le vrai problème :-) – MYMNeo

+0

. Voyez-vous une erreur de compilation (à quoi ressemble-t-elle) ou une erreur d'exécution? En tant qu'erreur de compilation, il est impossible d'obtenir une erreur 'number too big' parmi les '1U', '0' ou' 10'. Donc, vous devez avoir mal identifié la ligne, ou mal cité la ligne. Comme une erreur d'exécution, ce que vous voyez est le plus improbable - je ne devrais probablement même pas évoquer la possibilité. Donc, vous devez regarder d'autres lignes de code que celles que vous avez montrées jusqu'ici. Sur un système 32 bits, votre constante devrait être supérieure à 2147483647 pour obtenir le 'si grand qu'il est non signé' (plus de 32767 sur un système avec 16 bits 'int'). –

Répondre

0

Par défaut, les littéraux entiers sont signés. Si vous utilisez le suffixe U sur le littéral, cela indique au compilateur de le rendre non signé, par exemple. 123456789U. Cela devrait éclaircir l'avertissement à propos de la constante étant trop grande. Vous pouvez également utiliser la macro UINT64_C() de <stdint.h>.

Il est difficile de savoir ce qui cause votre FPE sans voir de code.

+0

Merci. J'ai juste essayé et ça ne marche pas (toujours l'avertissement et l'exception). J'ai 'number * = 10;' number étant l'uint64_t avec lequel j'essaie de travailler. Est-ce que c'est ce qui cause l'erreur? – Laurence

0

Avez-vous vérifié combien de fois la boucle for a été exécutée? Dans votre boucle for, le number a augmenté avec un ratio exponentiel. J'ai écrit un petit programme pour montrer la situation.

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 #include <stdint.h> 
    4 
    5 #define MAXLOOP 100 
    6 
    7 int 
    8 main(void) 
    9 { 
10  uint64_t number = 1U; 
11  int i; 
12 
13  for(i = 0; i < MAXLOOP; ++i){ 
14   number *= 10; 
15   printf("%d\t%lu\n", i, number); 
16  } 
17 
18  return 0; 
19 } 
20 

La sortie est:

0  10 
1  100 
2  1000 
3  10000 
4  100000 
5  1000000 
6  10000000 
7  100000000 
8  1000000000 
9  10000000000 
10  100000000000 
11  1000000000000 
12  10000000000000 
13  100000000000000 
14  1000000000000000 
15  10000000000000000 
16  100000000000000000 
17  1000000000000000000 
18  10000000000000000000 
19  7766279631452241920 <--- overflow, uint64_t can store 18,446,744,073,709,551,616 as its max value 
20  3875820019684212736 
21  1864712049423024128 
22  200376420520689664 
23  2003764205206896640 
24  1590897978359414784 
25  15908979783594147840 
26  11515845246265065472 
27  4477988020393345024 
28  7886392056514347008 
29  5076944270305263616 
30  13875954555633532928 
31  9632337040368467968 
32  4089650035136921600 
33  4003012203950112768 
34  3136633892082024448 
35  12919594847110692864 
36  68739955140067328 
37  687399551400673280 
38  6873995514006732800 
39  13399722918938673152 
40  4870020673419870208 
41  11806718586779598848 
42  7386721425538678784 
43  80237960548581376 
44  802379605485813760 
45  8023796054858137600 
46  6450984253743169536 
47  9169610316303040512 
48  17909126868192198656 
49  13070572018536022016 
50  1578511669393358848 
51  15785116693933588480 
52  10277214349659471872 
53  10538423128046960640 
54  13150510911921848320 
55  2377900603251621888 
56  5332261958806667264 
57  16429131440647569408 
58  16717361816799281152 
59  1152921504606846976 
60  11529215046068469760 
61  4611686018427387904 
62  9223372036854775808 
63  0 
64  0 
65  0 
66  0 
67  0 
68  0 
69  0 
70  0 
71  0 
72  0 
73  0 
74  0 
75  0 
76  0 
77  0 
78  0 
79  0 
80  0 
81  0 
82  0 
83  0 
84  0 
85  0 
86  0 
87  0 
88  0 
89  0 
90  0 
91  0 
92  0 
93  0 
94  0 
95  0 
96  0 
97  0 
98  0 
99  0 

Je pense qu'il est facile pour vous de comprendre: -.>

Questions connexes