【初月無料キャンペーン中】gooドクター

char型の配列char a[3] = "ab";(ヌルも含めて)により3バイト([0]〜[2])のデータ 0x610x620000となり、 二進数にすると 01100001(0x61(a),1バイト), 01100010(0x62(b),1バイト)、後の48bit(6バイト)は0として 64bitのメモリに二進数として保存されるとして、
仮に2バイトずつ読み込むと 0110000101100010となり、ヘンテコな数字が表示されるように思えるし、 どうやって二進数から16進数にして文字にしてprintfなどでabと表示してくれるのだろうか?と疑問が湧きます。 やはり1バイトずつ読み込んでいるのでしょうか?
(だとしても下に書いたint型のように12345の二進数 11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うという謎がのこります。)
また、
int a = 12345として12345の二進数11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うのですが、どうやって12345と正しく表示しているのか知りたいです。

もう一つ、
あの、printfの演算子%sや%dで二進数0110001(1)を表示すると、どうなるのでしょうか? ただ、1と表示されるだけでしょうか?

gooドクター

A 回答 (5件)

実際の動きはマシンに依存します。


単純な例で、0x01(8bit)はマシン上は2進数0000-0001で記録されますが実際に左から右へ(先頭から末尾へ、または上位から下位へ)0000-0001になっているかわかりません。
ビッグエンディアンとリトルエンディアンとか言います。インディアンではありません。
しかし、ソフトウエア上ではこういうことを意識する必要はありません。
64bitマシンなら64bit単位で読み書きして、ソフトウエアが必要な部分だけを見て作動していると思っていいともいます。
マシンを設計している人なら詳しく考慮するでしょう。
その2「printfの演算子%sや%dで二進数0110001(1)を表示すると、どうなるのでしょうか?」
疑問を持ったらやってみてください。
    • good
    • 0

>64bitのメモリに二進数として保存されるとして、


それは、質問者さんのPCの環境での話ですよね。

>思うのですが、どうやって12345と正しく表示しているのか知りたいです。
それは、質問者さんのPCの環境のCコンパイラに聞いてみて下さい。
具体的にどの様にしてメモリに保存し、どうやって12345と表示するかは、コンパイラが決めています。ここで 私のPCの私の使用しているCコンパイラでの処理内容を解説しても、回答になりませんよね。

おまけ
コンパイラにはアセンブラ出力のオプションがあると思いますので、疑問に思ったCのプログラムのアセンブラ出力を読めば、具体的な処理内容がわかりますよ。
    • good
    • 1

> int a = 12345として12345の二進数11000000111001も1バイトずつ読み込むと、多分12345にはならないと思うのですが、どうやって12345と正しく表示しているのか知りたいです。



ぶっちゃけ分からんです。
多分誰も「統一的な見解」としては分からんのじゃないですか?

そもそもC言語で何故に標準入出力ライブラリ、としてライブラリを分離しているのか、と言うと。
ハードウェアによって出力の仕組み等が全く違うから、と言うのが想定してる前提だから、です。
この辺、例えばそのハードウェアの機械語レベルであるとか、あるいはそのハードウェアのOSの提供するAPIであるとか。
その辺を利用してprintf等を作ってくれ、って言う事なのです。
仕様的には「その内情は問わない」と言うのが前提なのです。
そうすればC言語「本体」は小さい仕様で済む。
そして入出力関係は内部的に言うと「C言語仕様の範疇外」なのです。

今だとパソコンのCPUがインテル一色なんでピンとこないかもしれませんが、昔はモトローラのCPUだとか、他社の製品を使ったパソコンもありました。
ミニコン時代に至っては一つのミニコンで一つの中央演算処理装置、ってのも珍しくなく、下手すれば同じ会社の製品でさえ互換性がない、って言うこともありました。
C言語はそういう時代に生まれた言語で、入出力でさえ統一されてないのが当たり前、って時代に考案された言語なんで、その辺の「ややこしい事」を全部棚上げにしてライブラリとして定義して「無視した」ってのがアタマの良いやり方だったのです。
つまり、そういう言語である以上、「C言語の内部動作」を「C言語で考えて」「C言語で理解しよう」なんつーのは土台無理なんですよ。

貴方が本当に知りたい、と言うのなら貴方の使ってるPC(例えばWindows機)のハードウェア上の仕組みであって、「C言語の出力の仕組み」ではないのです。

> バイト

それから実は細かい事を言うと。
「バイト」も実は「ビットのまとまり」と言うのが定義ですが、実際問題「何ビットで1バイトとする」と言う風には定義されていません。
デファクトスタンダードでは8ビットで1バイトとする、という「例」が多いのは事実ですが(これは現在、CPUと言うより、はめ込まれる側のメモリの工業生産状態、つまり「コモディティ化」による要請になってる)、実の事言うと、これは厳密な定義じゃないです。
と言うのも、上のコンピュータの「会社で作ってる製品によって色々と定義が違う」って歴史の通り、コンピュータは1回でいくつかのビットを纏めて操作はしますが、「何ビットを纏めて」ってのは製品によって違ったのです。
言い換えると、どの会社のコンピュータでも「バイト」でメモリを区分けして扱いますが、じゃあ「どのくらいの数を纏めて?」と訊かれると「会社によって違う」ってのが原則だったのです。
事実、過去のミニコン製品も20bitを一つで纏めて、とか36bitを一つで纏めて、と言うようなブツがありました(つまり、こういうミニコンでは20bitが1バイトだったり、36bitが1バイトだった、と言う事です※)。

C言語のcharと言う型も、実は「文字が型」なのではなくって、こういう各コンピュータの「1バイトのまとまり」をcharとして表す事にしてる、って方が真実に近く、「数値である」と解釈したり「文字である」と解釈したり、ってのがあくまでコチラ側の都合であって、本質的な意味は違うんですよ。

※: ちなみに、必ずしもこういうのを「バイト」って呼んでたわけでもなく、他にもっと便利な言葉として、当時は「ワード」と言う単位も好んで使われていた。どっちにしても会社間横断して「一致した何らかの基準数値の話をしている」わけではないのは同じである。
結局、既に見た通り、実は物理学や化学等の「真っ当な」科学とは違い、コンピュータの場合は、「単位がハッキリしないまま」話が進む、と言うのは歴史的に見ると良くある話であり、そういう意味ではコンピュータ科学はマトモな科学ではなく、社会科学同様「疑似科学だ」と言えるだろう。
なお、今でも、例えばSSDやHDDの1キロバイトは何ビット問題だ、と言うのがあり、例えば4TBのHDDを買ってWindowsマシンに接続して容量を見ると3.63TBとか表示されてて、0.4TB近く一体どこへ消えたんだ?と言うのもこの「単位がハッキリしていない」のが根底の理由になる。
    • good
    • 0

’a'を10進数で表すと97, 'b'を10進数で表すと98



intは4バイト
12345を2進数にすると0011 0000 0011 1001
2進数から10進数への計算方法は中学校だか高校で習ったはずですけどね

CPUの中でどのように計算されてるかなどという深い話なら、今のあなたが知る必要などないですし、もう少し基礎どころかかなりのスキルを積んで専門書を読まないとダメです、今の知識では何を説明しても理解などできるわけがありません
    • good
    • 4

英小文字の「a」のasciiコードはx61、同「b」はx62です。


で、printf文についてはフォーマット指定子をしっかり理解しましょう。

https://www.k-cube.co.jp/wakaba/server/format.html

参考まで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング