質問するログイン新規登録

回答編集履歴

3

指摘に対処

2021/07/31 04:08

投稿

ikadzuchi
ikadzuchi

スコア3047

answer CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  > char型の配列char a[3] = "ab";(ヌルも含めて)により4バイト([0]〜[3])のデータ 0061006200000000となり、
4
4
 
5
- 16進数だとして、なりませんね。61620000になります。
5
+ 16進数だとして、なりませんね。~~61620000になります。~~
6
+ 下記追記の通り、(「0x」の誤りである)「00」は不要なのでせめて61620000ですし、
7
+ また4バイトでなく3バイトなので616200になります。
6
8
 
7
9
  > 二進数にすると 01100001(0061(a),1バイト), 00111110 (0062(b),1バイト)、後の48bit(6バイト)は0として 64bitのメモリに二進数として保存されるとして、
8
10
 

2

別の解釈に気づいたので追記

2021/07/31 04:07

投稿

ikadzuchi
ikadzuchi

スコア3047

answer CHANGED
@@ -50,4 +50,13 @@
50
50
  また例えばレジスタ幅32bitで32bitごとにしか読めないCPUがあったとしても、
51
51
  ・読むときは32bitを読んでから適宜シフトして不要な部分を0にする
52
52
  ・書くときは一度読んでから必要な部分を書き換えて書き戻す
53
- とすれば32bit未満のデータも扱えます。確か最初期のARMがそうだったと思います。
53
+ とすれば32bit未満のデータも扱えます。確か最初期のARMがそうだったと思います。
54
+
55
+ ---
56
+
57
+ あ、今気づいたんですが、
58
+ > int a = 12345として12345の二進数11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うのですが、どうやって12345と都合よく表示しているのか知りたいです。
59
+
60
+ この文章はもしや、「数値の12345(=11000000111001)をどう読んでも'1', '2', '3', '4', '5'の文字コードにならないが、どうやって表示しているのか」という質問と解釈すべきだったのでしょうか。
61
+ であれば答えは「そう都合よくいかないので頑張って10進変換の面倒なプログラムを書いて表示している」です。
62
+ 10進数への変換は単純な手法では10で割って商と余りを取る繰り返しでできます。きちんとしたライブラリの数値の10進表示ではおそらくもっと速い方法を使っていると思いますが具体的には知りません。

1

返答など

2021/07/30 14:23

投稿

ikadzuchi
ikadzuchi

スコア3047

answer CHANGED
@@ -26,4 +26,28 @@
26
26
 
27
27
  2進数0110001は1ではなく(ASCIIコードで「1」に相当する)49ですね。
28
28
  その2進数が1バイトで定義されているとして、%dではふつう4バイト読むのでその後の3バイトのメモリに入っている内容によりますが、仮に0なら、「49」と表示されるでしょう。
29
- %sなら少なくとも先頭に「1」が表示され、その後のメモリに入っているデータを\0に当たるまで表示し続けます。
29
+ %sなら少なくとも先頭に「1」が表示され、その後のメモリに入っているデータを\0に当たるまで表示し続けます。
30
+
31
+ ---
32
+
33
+ > 0x61,0x62でした。
34
+ > この場合でも0x610x62ではなく、0xが消えて61620000となるのは何故でしょうか?
35
+
36
+ あー…なるほどそこをそう誤解しているわけですね。
37
+ 「0x」というのは次に続くのが16進数だということを示すためのもので、「0x」自体は16進数の一部ではありません。
38
+ 「0x61」は「『61』という16進数」を表しています。
39
+ 「0x61」と「0x62」、すなわちそれぞれ2桁の16進数「61」と「62」を、つなげると4桁の16進数「6162」ができます。これは「0x6162」と書くことができます。
40
+
41
+ つまり、「0x」を16進数の一部だと誤解した上でそれを「00」と書き間違っていたなら、
42
+ "ab"とそれに続く(なぜか1バイトでなく)2バイトのヌルを「0061006200000000」と書いているのは、認識自体は間違っていないわけです。
43
+ 「0061006200000000」←「0x610x620x000x00」←「0x61620000」
44
+
45
+ ---
46
+
47
+ 話変わって。
48
+ 思ったのですが、もしかしてN bit CPUはN bitごとにしかメモリを扱えないと思っていませんか?
49
+ ほとんどのCPUは、32bitなら8bit, 16bit, 32bitのように自分のレジスタ幅より狭いbit数のデータをメモリから読めます。
50
+ また例えばレジスタ幅32bitで32bitごとにしか読めないCPUがあったとしても、
51
+ ・読むときは32bitを読んでから適宜シフトして不要な部分を0にする
52
+ ・書くときは一度読んでから必要な部分を書き換えて書き戻す
53
+ とすれば32bit未満のデータも扱えます。確か最初期のARMがそうだったと思います。