浮点异常和太大的持续警告?

时间:2012-09-27 01:40:20

标签: c floating-point-exceptions

我对发布我的代码犹豫不决,因为这是针对学校作业的,但基本上我需要遍历可能非常大的uint64_t

所以,我的值基本上可能是10个字符。它最初是一个int,代码部分有效(但没有完成它应该完成的输出)但是我得到了错误"warning: integer constant is so large that it is unsigned"

然后我将int更改为uint64_t(它乘以10),它会给我一个浮点异常。

没有代码的任何见解?

编辑:添加一些代码...

 uint64_t number = 1U;

 ...

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

^这给了我浮点异常。

不确定这是否足够有用。

2 个答案:

答案 0 :(得分:0)

默认情况下,整数文字已签名。如果在文字上使用U后缀,则告诉编译器使其无符号,例如123456789U。这应该清除关于常数太大的警告。或者,您可以使用UINT64_C()中的<stdint.h>宏。

如果没有看到某些代码,很难知道造成FPE的原因。

答案 1 :(得分:0)

您是否检查了for循环执行了多少次?在for循环中,number以指数比率增加。我写了一个小程序来显示情况。

  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 

输出结果为:

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

我认为您很容易理解。: - &gt;

相关问题