0

math.hライブラリを使用していますが、以下のコードを実行すると、複数行に対して「警告:暗黙の定数変換でオーバーフローが発生しました」というg++コンパイルエラーが発生します。ただし、とにかく実行可能ファイルを実行すると、妥当な数が提供されます(ただし、何らかの理由で、Intとlongの最大値は同じ値を返します)。しかし、cmathライブラリを使用すると、すべての符号付きデータ型は負の値を返し、符号なしはすべて0を返します。

C ++:

/* Calculating data type sizes directly */
/* Shorts - 2 bytes = 2*8(bits/byte) = 16 bits */
smallest_short = -(pow(2, 15));
largest_short = pow(2,15);               // LINE 141
us_smallest_short = 0;
us_largest_short = pow(2, 16);             // LINE 143

/* Ints - 4 bytes = 4*8(bits/byte) = 32 bits */
smallest_int = -(pow(2, 31));
largest_int = pow(2, 31);                  // LINE 147
us_smallest_int = 0
us_largest_int = pow(2, 32);                 // LINE 149

/* Long - 8 bytes = 8*8(bits/byte) = 64 bits */
smallest_long = -(pow(2, 63));
largest_long = pow(2, 63);                 // LINE 153
us_smallest_long = 0;
us_largest_long = pow(2, 64);                   // LINE 155

g ++コンパイルエラー:

datatypesexp.cpp: In function âint main()â:
datatypesexp.cpp:141: warning: overflow in implicit constant conversion
datatypesexp.cpp:143: warning: overflow in implicit constant conversion
datatypesexp.cpp:147: warning: overflow in implicit constant conversion
datatypesexp.cpp:149: warning: overflow in implicit constant conversion
datatypesexp.cpp:153: warning: overflow in implicit constant conversion
datatypesexp.cpp:155: warning: overflow in implicit constant conversion

math.hに固執する必要がありますか?警告を解決するにはどうすればよいですか?

また、警告を無視してmath.hでexecを実行すると、署名された「最大のint」と最大の長整数の両方が2147483647を返します。

符号なしの場合、両方とも4294967295を返します。しかし、longsはより大きな値を返すはずです...

どうすればこれを修正できますか?

4

2 に答える 2

0

スケールのその側には収容するゼロがあり、1つ少ない値が残るため、正の値はオーバーフローします。たとえば、pow(2, 31)は2,147,483,648(代入の前にdoubleとして表されます)ですが、この場合の最大の符号付き整数は2,147,483,647です。

于 2013-01-17T06:59:49.657 に答える
0

符号なしnビット変数が保持できる最大値は2^n-1であり、2^nではありません。

于 2013-01-17T06:59:54.160 に答える