限界値は2,147,483,647ゼニー
21億~です。汚い数字!?なんでこの値なのか、解説していきます。
実際の限界値の検証
GWでいろんなイベントが復刻されていましたね!アルケミスト諸兄はコインを集めて雫と交換したり、CCできていないユニットのCCをしたり、装備品を集めたり。属性別ミッションを埋めたりと忙しい連休を過ごしていたかと思います。(ほんとか?)
私は「海の頂上決戦」をオート周回してひたすら金塊を集めていました!開催当時は非常に厳しくなんだこのクソクエスト難しいクエストは!メンダコめ、クソ憎たらしいポップな見た目をしながらなんて攻撃を…区分耐性死んでくれ攻撃区分も意識して忙しいなぁ。なんて思いながらクリアできなかったものです。それが今ではフルオートで7分。そう。なぜなら私も特別な刻印を用意したからです(インフレーガクセニナル)
話がそれました。集めに集めたおかげで私もついにゼニーの限界値に到達することができたのです。気になるその値はこちら!


1ゼニーで売れるアイテムを売ろうとしても上記の表示が出るため、限界値は、
2,147,483,647ゼニー
であることがわかりました。
コンピュータ的には綺麗な数値
人間目線ではやはり「9,999,999,999」とかがきれいな数値に見えますね!しかし値を扱っているのは皆さんのスマートフォンやパソコン。いわゆるコンピュータです。こいつらから見ると綺麗な数字なのです。
プログラムを組む時にはいろんな値でコンピュータの中の領域をどのくらい使うか決めていて、ゼニーの値で使う領域を目いっぱい使おうとするとこの値が最大になるから。が答えとなります。
ここから詳しく説明していきますが、ここから先は全くタガタメ関係ありません。なので興味のない方はここで引き返しましょう。周回に戻りな!!!!!
…なるべく分かりやすく書きたいとは思っています。学術的な正しい表現とかは自信ないので、本職の方はあまり突っ込まないでください…
コンピュータで扱うのは2のn乗
はい。もうノイローゼが出ている方もいますね。お勉強の時間です。
なお私は開発者でもありませんし解析をしたわけでもないので、ここから先の内容は「あぁおそらくこういうことなんだろうな。」と言う推測の元記載をしていることをご理解ください。
コンピュータの内部では、数字は2のn乗という形で表現されています。 2,147,483,647というのは、2の31乗から1を引いた値になります。
プログラム上で2の32乗まで扱える領域を確保することで -2,147483,648~2,147,483,647の 42,94,967,296パターンを表現できるようにしていると考えられます。(32乗まで確保しているのに31乗-1が最大値の理由は、負の値とゼロに容量を取られているからです)
これがゼニーの所持限界がこの数値である理由です 。もう少しだけ詳しくいってみますね。
十進数と二進数
われわれ人間が使っているのは「十進数」です。人間じゃない人がこのブログを読んでたら教えてほしいし、日常的に十進数以外の数値を使っている方が居たら異常だという自覚を持ってください。対して、コンピュータが使っているのは「二進数」です。違いを説明します。
十進数
0,1,2,3,4,5,6,7,8,9の十個の数字を使って数値を表現するのが十進数です。
0から1ずつ増やして数を数え、9まできて次の数字が無くなったら隣の桁に1を足して、また0から9まで増やしていきます。
今まで生きてきて意識せずに出来ているかと思いますが、実際はこの時、一の位は1(10の0乗)を掛け、十の位は10(10の1乗)、百の位は100(10の2乗)を掛けて読んでいます。この掛ける数を「重み」と言います。「12,345」と言う値を例にとります。
桁 | 5 | 4 | 3 | 2 | 1 |
見た目の値 | 1 | 2 | 3 | 4 | 5 |
重み | 10^4 = 10,000 | 10^3 = 1,000 | 10^2 = 100 | 10^1 = 10 | 10^0 = 1 |
式 | 1 × 10,000 | 2 × 1,000 | 3 × 100 | 4 × 10 | 5 × 1 |
実際の値 | 10,000 | 2,000 | 300 | 40 | 5 |
出てきた値をすべて足すことで、値が出てきます。
10,000 + 2,000 + 300 + 40 + 5 = 12,345
まぁ十進数でこの計算をすると「なんでわざわざこんなにややこしいことを?」ってなります。が小学校1年生~2年生くらいでひっ算とか使って繰り上がりの計算とか一生懸命勉強した結果、すらすらできているのです。小学校ってすげぇ。うちの子はちょっと苦戦中です。
二進数
0と1の二つの数字を使って数値を表現するのが二進数です。
0から1まで増やして数を数え、1まできて次の数字が無くなったら隣の桁に1を足して、また0から1まで増やしていきます。
要するに十進数の1は「1」、2は「10」、3は「11」、4は「100」…となります。ややこしいようですがやっていることはさっきの十進数と一緒です。「12,345」だと桁が増えすぎるので、「50」を例にとってみます。「50」は二進数で表すと「110010」となります。
桁 | 6 | 5 | 4 | 3 | 2 | 1 |
見た目の値 | 1 | 1 | 0 | 0 | 1 | 0 |
重み | 2^5 = 32 | 2^4 = 16 | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 2^0 = 1 |
式 | 1 × 32 | 1 × 16 | 0 × 8 | 0 × 4 | 1 × 2 | 0 × 1 |
実際の値 | 32 | 16 | 0 | 0 | 2 | 0 |
出てきた値をすべて足すことで、値が出てきます。
32 + 16 + 0 + 0 + 2 + 0 = 50
うん。すんげーややこしいし分かりづらいですね。がっつり書く気も起きないので、 詳しく知りたい方は二進数とかでググってみてください(丸投げ)
この桁を31まで増やすとゼニーの限界の21億~に1を足した値が現れます。なぜ1を足すのかは後述。
ビットの考え方
「今月通信量やばいよ~」なんて時、ありますよね。7GB(ギガバイト)のプランとか、50GBのプランとか。コンピュータはこの「バイト」ってやつをいろんなところで使ってます。パソコンやスマートフォンのスペック表で、ストレージが2TB(テラバイト)、メモリが8GB、とか見たりするかと思います。これのもう少し小さい単位が「ビット」です。「ビット」は「バイト」の8分の1の大きさです。8bitで1Byteです。テラとかギガはよく体重なんかで聞くキロのもっと大きな値で、数学的な用語ですね。キロは千倍、メガは百万倍、ギガは十億倍、テラは一京倍という意味です。厳密にはコンピュータ的にはキロが1024(2の10乗)倍だったりするのですが、まぁこの辺は覚えなくてOKです。とにかく「ビット」ってものを使ってるよ!ってことだけ考えてください。この「ビット」は、1つで「0か1か」の二種類の状態を表すことができます。「0か1か」。そう!このビットが二進数の一桁の役割を果たすのです。
プログラム上の動き
プログラムでは、「おい!ゼニーを記録するのに32ビット確保してくれよ!」なーんてことが行われています。32ビットあれば2の32乗まで値が表現できて42億~になりそうですが、32ビットのうち1ビットは+or-の符号を表現するのにつかわれるため、数値を表すことができるのは31ビットだけです。「あれ?それじゃあ偶数になるんじゃないの?」と思った方もいらっしゃるかと思いますが、「ゼロ」も表現しなければならないので奇数になります。
従って、32ビットを確保すると、「-2,147,483,648~2,147,483,647」を表現できることになります。これを超えた値を表現するためにはもっと多くの領域を確保するなど、プログラム上で工夫をする必要があります。が色々制約があって大変なのでこの値に落ち着いているのだと思います。「9,999,999,999」などの表現はプログラム上はまだ余裕があるけどそこで切り捨てたりしているのだと思います。スキップチケットなどが9,999で表示が止まるけどもっと持てるようなのがいい例ですね。
終わりに
さすがに誰でもわかるように~というのは無理がありました笑
ゲームの内容とも全く関係ないのでモチベが上がらないのと、そこまで求められていなそうな気がするので雑ですが終わりにします><
気になる方は是非プログラミングや二進数について勉強してみてください~
それでは。
コメント