SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

伏石ちゃんは意図に反したい

脆弱性の原因にも? 整数オーバーフローの仕組みを見てみよう【伏石ちゃんは意図に反したい】

FILE 0x04 整数オーバーフロー


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (727.0 B)

解説:教えて那々子先生

充希
先生! テストの点数がオーバーフローしてます
先生
……ぷ
充希
何ですか、先生まで!
先生
悪い悪い。ランダム設問のデータの中に、配点が2147483647点のダミーデータが残ってたみたいでな。面白いからそのままにしておいた
充希
ひどい!

中途半端な数字なのはなぜ?

充希
……ところで、質問なんですが、なんでこんな中途半端な数字なんですか? 玲は2進数だからって言ってましたが
先生
OKコンピューター、教えてやれ
コンピューター
はい

 キーポイントとなるのは2進数です。

 よくコンピューターが「0と1だけの世界」と言われるように、コンピューターの内部では、数値データは0と1の羅列で表されます。

 その羅列は、整数値であれば、32桁や64桁など、データ型によって決まった長さとなっています。32桁で表された整数を32ビット整数、64桁の場合は64ビット整数と呼ばれます。

 例えば、C#ではint(Int32型)やuint(UInt32型)が32ビット整数にあたります。

 では、私たちが日常的に用いている1とか2とか3とかの数値を、どうやって0と1だけの羅列に変換するのでしょうか。実は、そこで用いられるのが2進数です。

 ここで、10進数と2進数の対応表を見てみましょう。

10進数と2進数の対応表
10進数 2進数
0 00000000000000000000000000000000
1 00000000000000000000000000000001
2 00000000000000000000000000000010
3 00000000000000000000000000000011
4294967295 11111111111111111111111111111111

 ここからわかるのは、4294967295という、いかにも中途半端な数値が、2進数になると32桁すべてが綺麗に1になる、つまり、32桁の2進数で表現できる最大値であるということです。

 この2進数をそのまま単純にデータとして用いたものを、符号なし32ビット整数と呼びます。符号なしというのは、正負符号がない、プラスの値のみという意味です。

充希
でも、4294967295が上限なら、2147483647点は上限値を超えないのでは?
先生
表をよく見ろ。マイナスの値がないだろう
充希
本当だ。マイナス値ってどう表すんですか?

マイナスの整数値は?

 では、マイナスの数値をどう表すのでしょうか。 

 いくつかの方法はありますが、整数の場合、半分の範囲をマイナス値に読み替えるという決まり事を設けるのが一般的です。

 具体的には、32ビット整数(0から4294967295まで)の場合、後半の2147483648から4294967295までの範囲の数値を、それぞれ-2147483648から-1までの範囲に読み替えます。

10進数と2進数の対応表
10進数 2進数
0 00000000000000000000000000000000
1 00000000000000000000000000000001
2 00000000000000000000000000000010
3 00000000000000000000000000000011
2147483647 01111111111111111111111111111111
-2147483648 10000000000000000000000000000000
-2147483647 10000000000000000000000000000001
-3 11111111111111111111111111111101
-2 11111111111111111111111111111110
-1 11111111111111111111111111111111

 こうすることで、表せる最大値はおよそ半分になってしまいますが、その分だけマイナスの数値も表せるようになります。

 このようにマイナスも表せる32ビット整数は、符号付き32ビット整数と呼ばれます。

充希
2147483647の次は、-2147483648。なるほど、だから、2147483647点に1点を足すと、符号付き32ビット整数では-2147483648点になってしまうんですね
先生
そう。つまり、言い換えるなら、お前のテスト点数は、ダミーデータがなければ1点だったってことだな
充希
分かってます……言わないで
先生
ちなみに、この読み替え方法は、「2の補数表現」といって、色々と面白いんだ。けど、教えるの面倒くさいから、あとは伏石に聞いてくれ
充希
先生の発言としてどうなんですか
先生
私の担当教科は技術倫理だからな。はっはっはっ

次のページ
実際に試してみよう

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

井二 かける(イブタ カケル)

 情報処理安全確保支援士、プログラマー、作家。「物語の力でIT・セキュリティをもっと面白く」をモットーに、作家活動、セキュリティ啓発活動を行う。主な作品はアニメ「こうしす!」、小説「こうしす!社内SE祝園アカネの情報セキュリティ事件簿」(翔泳社)、マンガ「伏石ちゃんは意図に反したい ~ハッキングから始まる高校生活~」(京姫鉄道出版)など。 Twitter:@k_ibuta@kyoki_railway

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山口 しずか(ヤマグチ シズカ)

 やりたいことはなんでもやる精神で急成長中の漫画家。2019年よりマンガアプリにて商業連載デビュー。連載の傍ら企業のPR漫画や漫画動画など媒体・ジャンルにとらわれず時代に合わせた漫画を制作中。趣味はお酒と旅行。 Twitter:@shizuckey

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15055 2021/10/25 11:33

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング