桁溢れ
日本語 | 桁溢れ、桁あふれ |
英語 | overflow |
ふりがな | けたあふれ |
フリガナ | ケタアフレ |
型に格納できる範囲を越えた値になること。
整数及び実数に対する四則演算を行うことで、格納する変数の型の最大値を越えた値になった場合、その値は不正となる。これを「桁溢れ」または「オーバーフロー」と言う。
整数や実数の四則演算は、JavaではなくCPUが行う。
この演算は「ビットでの処理」を行うため、型の範囲を考慮せず無理矢理ビット的な四則演算を行ってしまう。そのため、その結果が型の範囲を越えていた場合、異常な値となってしまう。
例外が投げられたりしないため、桁溢れの発生後に「桁溢れしたかどうか」を確認するのは難しい。桁溢れを防ぐためには、十分大きな型やBigDecimalクラスを使用する、もしくは四則演算を行う前に値をチェックすることが必要となる。
整数及び実数に対する四則演算を行うことで、格納する変数の型の最大値を越えた値になった場合、その値は不正となる。これを「桁溢れ」または「オーバーフロー」と言う。
整数や実数の四則演算は、JavaではなくCPUが行う。
この演算は「ビットでの処理」を行うため、型の範囲を考慮せず無理矢理ビット的な四則演算を行ってしまう。そのため、その結果が型の範囲を越えていた場合、異常な値となってしまう。
例外が投げられたりしないため、桁溢れの発生後に「桁溢れしたかどうか」を確認するのは難しい。桁溢れを防ぐためには、十分大きな型やBigDecimalクラスを使用する、もしくは四則演算を行う前に値をチェックすることが必要となる。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// int型での桁溢れ。
// 最大値を格納します。
int i = Integer.MAX_VALUE;
System.out.println( i );
System.out.println( getIntBit( i ) );
// 2147483647
// 01111111111111111111111111111111
// これに1を足すと桁溢れします。
++i;
System.out.println( i );
System.out.println( getIntBit( i ) );
// -2147483648
// 10000000000000000000000000000000
// このように、ビット的には1増えてますが、
// このビットは正の範囲ではなく負の範囲なので
// 変な値になっています。
}
/**
* int型変数をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
public class Sample
{
public static void main( String[] args )
{
// int型での桁溢れ。
// 最大値を格納します。
int i = Integer.MAX_VALUE;
System.out.println( i );
System.out.println( getIntBit( i ) );
// 2147483647
// 01111111111111111111111111111111
// これに1を足すと桁溢れします。
++i;
System.out.println( i );
System.out.println( getIntBit( i ) );
// -2147483648
// 10000000000000000000000000000000
// このように、ビット的には1増えてますが、
// このビットは正の範囲ではなく負の範囲なので
// 変な値になっています。
}
/**
* int型変数をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // int型での桁溢れ。 // 最大値を格納します。 int i = Integer.MAX_VALUE; System.out.println( i ); System.out.println( getIntBit( i ) ); // 2147483647 // 01111111111111111111111111111111 // これに1を足すと桁溢れします。 ++i; System.out.println( i ); System.out.println( getIntBit( i ) ); // -2147483648 // 10000000000000000000000000000000 // このように、ビット的には1増えてますが、 // このビットは正の範囲ではなく負の範囲なので // 変な値になっています。 } /** * int型変数をビット形式で返します。 */ private static String getIntBit( int i ) { // int型変数をビット形式で文字列化します。 String source = Integer.toBinaryString( i ); // 左0埋めします。 StringBuffer strbuf = new StringBuffer(); for( int iF1 = source.length(); iF1 < 32; ++iF1 ) { strbuf.append( "0" ); } strbuf.append( source ); return strbuf.toString(); } }