実際、ループを使用してコードをより効率的にする方法について研究しました。これにより、特定のコードブロックを何度も入力せずに繰り返す必要があり、学んだことを使用しようとした後、何かをプログラムするにはほど遠いので、次の章に進み、制御ステートメントを使用してプログラムに決定を指示する方法を学ぶ時が来たと感じています。
しかし、問題は、私がそれに進む前に、以前のものについて専門家の助けが必要ないくつかの質問がまだあるということです. 実際にはデータ型についてです。
A. キャラクタータイプ
- 本 C 入門プラス第 5 版から以下を抜粋します。
やや奇妙なことに、C は文字定数を
int
ではなく 型として扱いchar
ます。たとえば、32 ビットint
と 8ビットの ASCII システムでchar
は、コードは次のようになります。char grade = 'B';
'B'
は 32 ビット単位で格納された 66 を数値として表し、grade
8 ビット単位で格納された 66 の ub ab で終わります。'FATE'
文字定数のこの特性により、32 ビット単位に格納された 4 つの別個の 8 ビット ASCII コードを使用して、などの文字定数を定義することができます。ただし、このような文字定数を変数に割り当てようとするとchar
、最後の 8 ビットしか使用されないため、変数は値を取得します'E'
。
したがって、これを読んだ後に私が次に行ったことは、もちろん、それが言及していることに従い
FATE
ましたchar grade
.アウト、私が得るものは.printf()
'E'
'F'
これは本に間違いがあるということですか?または私が誤解したことがありますか?
上記の文から、C は文字定数を type として扱うという行があり
int
ます。試しに、型に255
, (ex356
)より大きい数値を割り当てchar
ます。356
は 32 ビットの範囲内にあるため(Windows 7 を実行しています)、指定子を使用するとint
出力されると予想されます。356
%d
しかし、 を出力する代わりに、最後の 8 ビット値である が
356
得られます。100
なぜこれが起こるのですか?私は思った
char == int == 32-bits
?(char がバイトにすぎない前に言及していますが)。
B. Int 型と Floating 型
型の変数に格納された数値が
short
可変引数関数または暗黙のプロトタイプ関数に渡されると、自動的にint
型に昇格されることを理解しています。これは浮動小数点型にも起こります。型を持つ浮動小数点数
float
が渡されると、double
型に変換されます。そのため、型の指定子はなく、代わりにforとforfloat
しかありません。%f
double
%Lf
long double
しかし、
short
昇格されてもタイプではないのに、なぜタイプの指定子があるのfloat
でしょうか?float
修飾子などを使用して型の指定子を指定しないのはなぜ%hf
ですか? この背後に論理的または技術的な何かがありますか?