2012年12月13日木曜日

int がオーバーフローするとどうなるか


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 件のコメント:

コメントを投稿