C言語規格は、CPUの処理能力を最大限発揮できるアセンブラ以外の言語を作ることが目的です。
そのため、CPUの処理能力の発展を妨げることをしないことを高らかに宣言しています。
C言語規格では、integral promotion(汎整数拡張)と言っていたこともあるかもしれません。
違いがわかっていません。
promotionは、日本語では昇格の意味です。格が低いものが、高くなることを指します。
CPUのレジスタでは、8bitレジスタに入っている値が、16bitレジスタに入る。
16bit レジスタの値が32bit レジスタに入る。32bit レジスタの値が64bit レジスタに入ることがpromotionという概念に一番しっくりくるような気がします。
レジスタ同士でなくても、メモリのより8bitデータを、16bitレジスタのような大きな箱に入れるのもpromotion(昇格)。
未定義(undefined)
C言語規格で規定するとCPUの発展を妨げるといけないことを宣言しています。
「未定義」宣言と読み直すと理解が進むでしょう。
未規定(unspecified)
CPUの実現方法によっては、複数の処理の可能性がある場合に、どちらでなくてはいけなかを規定しないことを宣言しています。
「未規定」宣言と読み直すと理解が進むでしょう。
処理系定義(implementation defined)
CPUとCコンパイラ(処理系)の役割分担により、コンパイラが定義するとよい事項を宣言しています。
「処理系定義」宣言と読み直すと理解が進むでしょう。
整数拡張(integer promotion)
CPUのレジスタの大きさと、C言語規格の変数の大きさと違う場合には、メモリ上の値をCPUのレジスタの大きさに拡張して格納するCPUの機能をさします。
基本はC言語規格の機能ではなくCPUの機能です。そのCPUの機能を、複数の異なるCPUの間で、どう調整つけるかとして、C言語でも整数拡張の変換規則を整理しています。もし、CPUに機能がない場合には、C言語の仕様を採用してくださいというお願いです。CPUの機能を理解せずに、C言語の機能だけで理解しようとすると、「違法」だとかいう訳のわからない単語が飛び出すのかもしれません。
8bit レジスタ, 16bit レジスタ, 32bitレジスタなどの複数の大きさのレジスタを持ったCPUの場合には、Cコンパイラの設計上、必ずしも整数拡張をすることを優先しないかもしれません。
8bitレジスタの乗算は16bitとして保存する場合がありました。
16bitレジスタの乗算は32bitとして保存する場合がありました。
レジスタとして持っているか、複数のレジスタを使用するかはCPUの設計によります。あるいは呼び方、命名規則だという言い方ができる場合があるかもしれません。
C言語規格の歴史的な制約として、16bit レジスタのある計算機で設計しています。
その後、32bit レジスタのある計算機に移行しています。
8bit レジスタと16bitレジスタの両方を持ったCPUと、16bit レジスタしかないCPUとの間では、綱引きがあったかもしれません。さらに、32bit レジスタしかないCPUと、8bit レジスタと16bitレジスタと32bit レジスタを持ったCPUの間でも、綱引きがあったかもしれません。
C言語規格がどうであれ、CPUの処理能力を最大限に引き出すのがCコンパイラ(処理系)の使命です。
他のCPUと同じ答えを出すための処理と、そのCPU特有の速さを実現する処理の、複数の処理をコンパイラのスイッチで提供するのも、一つの回答かもしれません。
演算の途中、代入の際に、なるべくオーバフロー、桁落ちなどがないようなCPUの工夫をC言語が素直に取り入れようとした部分と、CPUに工夫がない場合には、Cコンパイラが対応するように促しているのがC言語規格だという理解はいかがでしょうか。
32bitレジスタしか持っていないCPUでは、メモリ上の8bitデータをレジスタに読み込むと、unsignedの場合は、上位の24ビットは0が埋まります。これも、CPUの整数拡張です。そういう32bitCPUが多そうだったので、C言語の整数拡張も、unsigned の場合は上位が0が埋まるような規定を原則としようとしています。
最終的には、CPUの設計によるのであって、C言語規格がCPUがしていないことを無理に処理させるのではありません。
ただし、他のCPUに移植する際に、あるC言語規格の仕様に合わせる処理があれば、データの同一性を確保できるかもしれません。
参考資料
@iyoshiha 整数拡張(型変換に関して)
@fujitanozomu ナウい言語は暗黙の整数拡張を行わないか?
@spicemanjp メモ:シフト演算子でも整数拡張は起こる
@7of9 secureCoding > 整数拡張 (integer promotion) | 整数変換の順位 (integer conversion rank) | 通常の算術型変換 (usual arithmetic conversion)
@yz2cm C言語で暗黙の型変換が発生する16のパターン(+演算子の結果型5パターン)
自己参照
C言語(C++)に対する誤解、曲解、無理解、爽快。
C言語:未定義、未規定、処理系定義
最新のC言語規格の案
N2731 (1) 3.14 memory location
Integer Promotions
Integer Promotions in C
Deep C: Integer Promotion
Integer Promotions in C
A quick look at integer promotion in C
integer promotion in C
Integral promotion
Integral promotion
8.2 — Floating-point and integral promotion
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.