ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2013年5月8日水曜日

【iOS,Android】信じがたい! うっそ! ゼロ除算の考察の行方!

結論から言います!

ARMアーキテクチャでは、ゼロ割(0除算)のエラーはおきません!


事の発端は!

@hamakendevelopさんのこの発言!

コレを偶然みて、そんなバカなぁ!
なんて思ってサンプルを作ったのが発端です!




まず、サンプルをMac OS Xで作ってみました!

結果は予想通り、
c = a / b;
のところで、Exception発生!




やっぱそうだよなぁ・・・
なんて思いつつ、一応、iOSのサンプルも作ってみました!

コレをiOSシミュレータで起動!
結果は予想通り、
NSLog(@"%d", a/b);
のところで、Exception発生!


そりゃそうだ!
と思って、同じソースコードをiPhone5にて動作させてみました。

ほんまや!
(明石家さんまさん風)

結果は予想に反して、iPhone5で例外が発生しませんでした!

うげ!
まじか!!!
なんて思っていたところ、

@sakiraさんが参戦!!!





ちょっと調べたところで、





と言った返信をした訳です。
あ!ちなみに、
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205hj/CJADECCJ.html

ここを添付しました。

この時点で、もう既に、かなりの時間になっていたので、一旦休憩(笑)

その次の日。

@sakiraさんから信じがたいツイートを頂いた訳です!










まじか!

AndroidでもJavaではなくて、Native C言語をコンパイルした
実行ファイルでは、エラーが発生せず、さらに、
iOSではsignal()でのハンドリングも効かないとのこと・・・

そんな・・・そんな・・・バカな・・・なんて調べ、
いろいろと議論したところ、以下のサイトに行き着きました!

http://blog.kmckk.com/archives/4047024.html

うっそ!!!
libgccでの事だったんだ!!!

Xcodeも元々はgccが発祥なので、可能性は多いにあるとの結論に
なりました!


サイトを参照するに、

・ARMには除算命令がない

ために、libgccで除算をするしかなく、libgcc内で除算を行っている。

とのことでした!!!

とりとめのない書き方になりましたが、結論通り、

ARMアーキテクチャは除算命令がないために、libgccで除算を
行っており、libgcc内で、raise()を行っていないため、
Exceptionが発生せず、そこでCPUがストップするため、
除算結果の変数を参照すると、不定になる!

と言った事がわかりました!
(推測も入ってますが^^;;;)

最後に、@sakiraさんの言葉がカッコいい!!!










2013年4月22日月曜日

Javaの関数の引数について ーJavaの値渡しと参照渡しの誤解ー

昨日Twitterで宣言しましたが、Javaの引数について書きたいと思います。

Javaの引数は基本的に、

プリミティブ型=Call By Value = 値渡し
オブジェクト型=Call By Reference = 参照渡し

になります。

で、Call By Referenceの説明で
String型を使って以下の説明をしているのが多くあります。

さあ、ここで問題です!
出力は何になるでしょうか?

答えは、
”before method call”
です。

当たり前です(^^)/

C言語で書くと、


こうやってるのと同等です。

それ、C言語で言うと、ポインタのポインタを使わないと
出来ませんよ^^;;;

あと、



これも同じです!
これも同じC言語のポインタのポインタ使わないと^^;;;

Call By Referenceの説明で、上の例を使って、Call By Referenceだけど・・・
なんて説明しているのは間違いです!

C言語でいう、ポインタの概念をちゃんと理解しないと実は
この辺りって理解が難しいかもですね!

あ!
constじゃないととか、そういうツッコミはなしね^^
あくまで例なので!