いまいちどこが分かっていないのか分かりませんが…
char型の配列char a[3] = "ab";(ヌルも含めて)により4バイト([0]〜[3])のデータ 0061006200000000となり、
16進数だとして、なりませんね。61620000になります。
下記追記の通り、(「0x」の誤りである)「00」は不要なのでせめて61620000ですし、
また4バイトでなく3バイトなので616200になります。
二進数にすると 01100001(0061(a),1バイト), 00111110 (0062(b),1バイト)、後の48bit(6バイト)は0として 64bitのメモリに二進数として保存されるとして、
0062が16進数だとして、00111110ではなく01100010ですね。あと0062の余計な00が謎です。
仮に2バイトずつ読み込むと 0110000100111110となり、ヘンテコな数字が表示されるように思えるし、
2バイト読めばそうなります。char配列で定義した文字列をshortとして読んだりするとたいていそのようになります。(エンディアンの違いはありますが)
どうやって都合よく6162と表示してくれるのだろうか?と疑問が湧きます。 やはり1バイトずつ読み込んでいるのでしょうか?
1バイトづつ読んでもいいですし、複数バイトまとめて読んでから分割してもいいです。
int a = 12345として12345の二進数11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うのですが、どうやって12345と都合よく表示しているのか知りたいです。
何を疑問に思っているのか分かりません。
1バイトづつ読んで駄目なら2バイトづつなり4バイトづつなりで読めばよいですし、
1バイトづつしか読めなくても(例えば8bitCPUはたいてい1バイトづつしか読めない)、1バイトづつ読んだものを適切に処理して"12345"と表示するプログラムは普通に書けます。
あの、printfの演算子%sや%dで二進数0110001(1)を表示すると、どうなるのでしょうか? ただ、1と表示されるだけでしょうか?
2進数0110001は1ではなく(ASCIIコードで「1」に相当する)49ですね。
その2進数が1バイトで定義されているとして、%dではふつう4バイト読むのでその後の3バイトのメモリに入っている内容によりますが、仮に0なら、「49」と表示されるでしょう。
%sなら少なくとも先頭に「1」が表示され、その後のメモリに入っているデータを\0に当たるまで表示し続けます。
0x61,0x62でした。
この場合でも0x610x62ではなく、0xが消えて61620000となるのは何故でしょうか?
あー…なるほどそこをそう誤解しているわけですね。
「0x」というのは次に続くのが16進数だということを示すためのもので、「0x」自体は16進数の一部ではありません。
「0x61」は「『61』という16進数」を表しています。
「0x61」と「0x62」、すなわちそれぞれ2桁の16進数「61」と「62」を、つなげると4桁の16進数「6162」ができます。これは「0x6162」と書くことができます。
つまり、「0x」を16進数の一部だと誤解した上でそれを「00」と書き間違っていたなら、
"ab"とそれに続く(なぜか1バイトでなく)2バイトのヌルを「0061006200000000」と書いているのは、認識自体は間違っていないわけです。
「0061006200000000」←「0x610x620x000x00」←「0x61620000」
話変わって。
思ったのですが、もしかしてN bit CPUはN bitごとにしかメモリを扱えないと思っていませんか?
ほとんどのCPUは、32bitなら8bit, 16bit, 32bitのように自分のレジスタ幅より狭いbit数のデータをメモリから読めます。
また例えばレジスタ幅32bitで32bitごとにしか読めないCPUがあったとしても、
・読むときは32bitを読んでから適宜シフトして不要な部分を0にする
・書くときは一度読んでから必要な部分を書き換えて書き戻す
とすれば32bit未満のデータも扱えます。確か最初期のARMがそうだったと思います。
あ、今気づいたんですが、
int a = 12345として12345の二進数11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うのですが、どうやって12345と都合よく表示しているのか知りたいです。
この文章はもしや、「数値の12345(=11000000111001)をどう読んでも'1', '2', '3', '4', '5'の文字コードにならないが、どうやって表示しているのか」という質問と解釈すべきだったのでしょうか。
であれば答えは「そう都合よくいかないので頑張って10進変換の面倒なプログラムを書いて表示している」です。
10進数への変換は単純な手法では10で割って商と余りを取る繰り返しでできます。きちんとしたライブラリの数値の10進表示ではおそらくもっと速い方法を使っていると思いますが具体的には知りません。