C#は、デフォルトでは、算術計算などでオーバーフローしても例外を返しません。
int型の2つの値を掛け算して、結果もint型で表示してみます。
int型の最大値は、2の31乗-1 =2,147,483,647 なので、オーバーフローさせるには、結果がこれを超えるように入力します。
オーバーフローした場合は、上位ビットが切り捨てられます。
オーバーフローしない場合は、正しい計算結果になっている。
オーバーフローする場合は、結果がおかしい。
10進数で 100,000×100,000 は、10,000,000,000になる。
10進数の10,000,000,000を2進数で表すと34桁になる。
(2進)1001010100000010111110010000000000 = (10進)10,000,000,000
int(int32)は、1ビット目から31ビット目が値なので、それを10進数にすると、1,410,065,408 になる。
(2進)1010100000010111110010000000000 = (10進)1,410,065,408
符号を表す32ビット目が 0 なので 正の整数。
MainWindow.xaml
<Window x:Class="OverFlowTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="85" Width="225">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<TextBox Name="textBoxX1" Width="50"/>
<TextBlock>×</TextBlock>
<TextBox Name="textBoxX2" Width="50"/>
<TextBlock>=</TextBlock>
<TextBlock Name="textBlockY"/>
</DockPanel>
<Button Grid.Row="1" Click="Button_Click_1">計算</Button>
</Grid>
</Window>
MainWindow.xaml.cs
using System.Windows;namespace OverFlowTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
int x1 = int.Parse(this.textBoxX1.Text);
int x2 = int.Parse(this.textBoxX2.Text);
int y = x1 * x2;
this.textBlockY.Text = y.ToString();
}
}
}
0 件のコメント:
コメントを投稿