2010年2月11日木曜日

メモ工学特論第一

どうも、買ったけどまだ読んでいない本の数が山の如しのQです、こんちには。

明らかに読む速度が追い付いていない(笑)全部読もうと思うと年単位の時間は必要なんじゃないだろうか?しかし、いつ開くことになるか分からないから捨てるに捨てられないんだよなぁ。逆に一度読んだ本も書き込みまくったり,変に愛着が湧いて捨てられない。結果凄いことになる。


1.Drawing through
X windowにおいて、gcの設定でIncludeInferiorsというのが合った。サブウィンドウを透過的に扱う、的な意味なのだがこの辺のマニュアルでdrawing throughというフレーズが出てきた。最初よく意味が分からなかったのだが、どうも「透明なものを描く」的な意味らしい。
マニュアルの中では、単に「・・・を透過的に描く」って感じだが、上記の意味もあるらしい。へー勉強になった。




2.other than、besides
othar than hogehoge、と書いてあったら「hogehoge以外の」というニュアンス。
besides hogehoge,と書いてあったら「hogehogeの他に」というニュアンス。




3.lookahead,staging
先読みをlookaheadと言うらしい。
staging areaと書くと足場となる領域的な意味になる。



4.c,java,unsigned,2の補数
とあることでjavaのソースを読んでいた。
てかjavaの勉強なんてしたことないに等しいのだがpython?か何かのおかげで読めるようになっていたのは驚いた。今さらjavaを書く気はしないのだが、膨大なサンプルソース、プラットホームを選ばない特性から読むことは往々にしてある。

で、javaってunsignedの概念無いのね・・・。Cから入ってマイコンしてた僕としては非常にわかり難い。あと、googleで調べても何が正しいのかよくわからない感じ。

とりあえずまず2の補数の考え方
(二進数 = 十進数)
00000000 = 0
00000001 = 1
11111111 = -1
11111110 = -2
01111111 = 127
10000000 = -128
覚え方はいくつかあると思うのだが、要するに
00000001 = 1に(-1)を足したら当然
00000000 = 0になる。
従って-1に相当する表現は
11111111 = -1
でしょ?ていうだけの話と僕は理解している。
1 + (-1) = 0
00000001 + 11111111 = 00000000
実は加算器で減算を表現できるとか、1の補数だと0の表現が二個できて厄介とかその辺の話が分かってないと悲惨。

C言語だとプラットホームの影響を受けて怪しくなることがあるようだが、javaでもcでも多分僕のような素人が普通に使うレベルだとまず上記に従ってると思って大丈夫かと思っている(盲信は危険だが)。

問題はunsinged。
C言語ではビット操作を扱うのがわりに簡単に出来る。それはunsignedがきちんと定義出来るから。例えば

char c = 0xff;
short s;
s = (short)c;
printf("%d",s);

とすると-1と表示される。2の補数の概念が適用されて0xff = -1と解釈されるからだ。
一方、

unsigned char c = 0xff;
short s;
s = (short)c;
printf("%d",s);

とすると255と表示される。2の補数の概念が適用されず、0xff = 255と解釈されるからだ。僕はこの型を厳密に決めるところが結構気に入っている。
ところがjavaではこのunsingedが使えない。つまり、前者のパターンでしか計算できないことになる。これが実は結構危険。早い話、
high_byte = 0xff
low_byte = 0xff
とすると、cならunsingedが使えるのでhigh_byteやlow_byteをunsignedで宣言しておけば、
uint = ((unsigned int)high_byte * 256) |
    (unsigned int)low_byte;
で棲むが、javaの場合、high_byteが-1と解釈されてしまって、high_byte * 256の処理が悲惨なことになってしまうぽい。
回避する手段としてこんなメンドクサイことをする。
uint = ((high_byte & 0xff) * 256) |
    (low_byte & 0xff);
要するに、演算をする前の状態をビット演算で等価的に維持する、という感じになる。他の型に変換される際に、実際には「signedの数値として扱われる」が、ビット演算によって「元の型におけるビットの状態のみを保存する」って言えばいいのかな。

cから入った身としては非常にややこしい。でもこれが分かってないと・・・まあ色々とね。

あとついでに。
C言語でもある変数の内容がsignedの変数に代入されたり、unsignedの変数に代入されたりするような実装はダメかも。つまりsignedとunsignedの型の間でキャストが生じるようなプログラムは構成を考え直した方が良い。





javaよりも
cとpython
使います
//やはり覚えることが少ない言語に限るぜ・・・

0 件のコメント:

コメントを投稿