SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

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

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


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

減算と2の補数表現

んー、何から説明したらいいか……。実は一般的なコンピューター……というかデジタル回路の引き算って、足し算でやってるって知ってる?
充希
引き算を足し算で?
引き算って、マイナスの値を足し算するのと一緒でしょ? 3 - 2は、3 + (-2)と同じ
充希
ああ、うん
OKコンピューター、減算の計算過程を例示してみて
コンピューター
はい

 では、3 - 2 = 1の計算を考えてみましょう。

 3 - 2は、3 + (-2)と考えます。

2進数への変換表
10進数 2進数
1 00000000000000000000000000000001
3 00000000000000000000000000000011
-2 11111111111111111111111111111110

 次に、この変換表から、それぞれ2進数に変換します。

 3の2進数は、

00000000000000000000000000000011

 -2の2進数は、

11111111111111111111111111111110

です。

 この2個の2進数を加算しましょう。

 10進数の加算では10で繰り上がるのと同様、2進数の加算では、2で繰り上がっていきます。

   00000000000000000000000000000011
 + 11111111111111111111111111111110
-----------------------------------
  100000000000000000000000000000001

 計算結果は100000000000000000000000000000001です。そして、オーバーフローした桁(つまり、最後に繰り上がった一番左の桁)が捨てられますから、計算結果は00000000000000000000000000000001となります。

 これを10進数に直すと、1です。

 このように、3 - 2 = 1の減算を、2進数の加算だけで行うことができました。

充希
ほえぇ……騙されたみたいだけど、何かうまくいってる
じゃあ、0 - 1の計算をやってみようか
充希
ええと……
2進数への変換表
10進数 2進数
0 00000000000000000000000000000000
-1 11111111111111111111111111111111
充希
――だから
  00000000000000000000000000000000 
+ 11111111111111111111111111111111 
-----------------------------------
  11111111111111111111111111111111
充希
1が32個
それを符号無し32ビット整数の表で10進数に変換したらどうなる?
2進数への変換表
10進数 2進数
4294967295 11111111111111111111111111111111
充希
あ、4294967295
ね、当たり前でしょ
充希
……本当だ、なんだか騙されたみたいだ
こんなふうに、マイナスの数値を「2の補数」で表現すると、足し算だけで引き算ができるから効率的で便利。でも、こういう足し算だから、結果的に、ラップアラウンドが起きるってこと
充希
なるほど
まあ、簡単な話でしょ
充希
いや、頭がオーバーフローしそうだよ
……てか、こんな基礎的な知識、先生に聞かなかった?
充希
そういえば、「2の補数表現」のことは、面倒臭いから「伏石に聞け」って言ってたっけ
……それ、職務放棄では

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

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

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

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/15055 2021/10/25 11:33

イベント

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

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

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

メールバックナンバー