意識することはないが、普通にしていたらたしかに「符号」と「整数部は正の整数で」出してくれる。付け、整数部は正の整数で表示するという仕様である。負の数値のビット表現については、とくに考慮しない。確認してみたが、負の数のビット表現に関する記載は、見つけられなかった。*print-base*を確認してみたが、負の値を私が求めているようなビット列として表示する方法に関する仕様は見つけられなかった。私が生きているよりずっと長く、私よりもはるかに賢い人たちにもまれた言語である。今は漬け込まれている。(その存在に気付いた人がおいしく食べていく)したがって、そうしているのには理由があると思われた。”そうしないと決めた理由がどこかにあるだろう”と想像された。ここまでの調査でひとまずわかったこととして。標準仕様が、思い通りの挙動をしてくれないことはわかった。整数値は、無限に桁数を持つことができる、という仕様がかかわっているように思われた。ビット演算を試したとき、どうやら私は暗黙に有限桁数のビット列を想像していたようである。16ビットなり、8ビットなり、64ビットなりで表現された数値を想像している。ついて区別して考えている。した場合、負の数はたった一つの表現を得ることになる。符号なしであれば、符号ありの場合に負の数にあたるビット表現に対しては、正の整数が与えられる。CommonLispの整数は違う。無限の桁数を持っている。無限に桁数を持つということはどういうことか?考えてみるにそれは、有限桁で区切ると、「そのビットより上位側のビットが0なのか、1なのかわからなくなる」ということである。整数値を8ビットで表現してみました!といって次のような表を出すとする。0000私の頭の中では今回の例を試したとき、このような感じの頭になっていた。冷静になってから見てみると、何かがおかしい。この整数の型は、なんだ?気付いてみるとものすごい違和感を覚える。-127と64が同じ表現になっていて混乱しないのか問いただしたくなる。ないと表現できないだろう、、、。型がある言語であればその上限・下限に強く意識を持つものだが、境界を持たないという定義を持つ環境では、具体的なビット表現に思いを寄せることがなくなっているのに気づく。?そもそもこの数値は、本当に8ビットで考えているのか?若干怪しい。いや、だいぶおかしい。それでいて違和感を覚えないのは、今何をしているか、どのような結果になるかについて、”内部の表現に考えを寄せることなく”想像できているためなのだろう。ビット表現の話に戻そう。次のように解釈できる。表しているしかし、ビット列が上位側へ無限につながっているとしたら、次のような場合も考えられる。表しているそして、「いずれも正解である」と言える。表示に対する解釈が違うだけである。前提がはっきりしていない(もしくは自分の中でだけはっきりしている)ので一つに決められるだけではないか。このおかしさに気付くと、そもそも負の数のビット表現ってどうやってするのだったかを思い出すことになる。16bitあればsignedの値として正常に表現できることだろう。0000無限に長さを持つということは、何ビット目を見ても、まだ上位側にビットが続いているということである。どこかで「あるビットからは、どの上位ビットを見ても0だらけ(正)か1だらけ(負)」である状態になるのだが。表示するうえでは無限にビット列を表示するわけにもいかないため、有限桁数で止めることになる。その場合に、その後続く上位側のビットが1なのか0なのか、区別がつかない可能性が残るということである。8bit表示したところで止めてしまった場合、同じ表現に見えるということである。関数は、これらの表現とは別の表現を用いることにしているようである。符号+整数部(負であれば正の値に符号反転した値)で表現する。無限にビットが続くということを考えると、よい割り切り方だと思う。整数部をそのままビット値で表してくれるのは、、、使ってみると悩ましい。ねえ、そうじゃねえだわ。結果的に予期せぬ落とし穴になっていた。無限に続く上位ビットの表現に関して。今後もそのように表記するし、表示用のコード例も同じようにしている。やったらビット列を思ったような表現にできるのだろうか。ここまでで、何が起こっているか、何を間違っていたかはおおむね分かった。関数の表現を使い続けるのか。いやまあ、関数とか作ることができるだろう。format関数は、負の整数は思ったのと違う結果になるが、正の整数については正常に値を表示するのだから。無限に桁数を考えたときの表示を考えてやればよいだけの話である。手掛かりは、format関数のビット表現である。ビット表現が全くできないわけではない。正の整数であれば、思った通りの値を表示できる。負の数をビット表示した場合に、上位側ビットがすべて1になる前の部分を正の整数として表現できれば、何とかなる。次のように考えられる。843それを考えるには、そもそも負の値はどのようなビット列になるのか?それを10進数で表示すると一般的にはどうなるのか?考える必要がある。2の補数についてlog*系関数はいずれも2の補数であることを前提とした処理となっている。バイナリによる負の数の表現には、2の補数を用いることが多い。負の値のビット表現は知らずのうちに2の補数による表現になっていることがある。知識として1の補数(負の数は、正の数ビット表現に対するビットごとのxorの結果に等しい)が言及されることもあるが、今回は関係ない。元の数を引いた数が2の補数である。(Wikipedia)他にも次の性質がある。1おお、、なるほど、、、どれを使えばいいんだろう、、、。0000これで無限にビット列があると想定した場合も、例えば次のように表せる。補数についてわかったところで、今のところ現時点での目的であるビット表現に考えを戻してみる。求めたい値は何だろうか?それがほしい負の整数値のビット表現を得るために必要な正の整数値である。何がほしいんだろう?えーっと。