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 整数拡張(型変換に関して)
https://qiita.com/iyoshiha/items/e97f53a364811542edc6
@fujitanozomu ナウい言語は暗黙の整数拡張を行わないか?
https://qiita.com/fujitanozomu/items/60b4d86b6c32e78d0420
@spicemanjp メモ:シフト演算子でも整数拡張は起こる
https://qiita.com/spicemanjp/items/f4915fe83632ddd61aeb
@7of9 secureCoding > 整数拡張 (integer promotion) | 整数変換の順位 (integer conversion rank) | 通常の算術型変換 (usual arithmetic conversion)
https://qiita.com/7of9/items/7aa94a9f2207a989f129
@yz2cm C言語で暗黙の型変換が発生する16のパターン(+演算子の結果型5パターン)
https://qiita.com/yz2cm/items/0e24e1df40ef5cd43249
Integer Promotions
Integer Promotions in C
https://www.geeksforgeeks.org/integer-promotions-in-c/
Deep C: Integer Promotion
http://www.idryman.org/blog/2012/11/21/integer-promotion/
Integer Promotions in C
https://www.tutorialspoint.com/integer-promotions-in-c
A quick look at integer promotion in C
https://www.opensourceforu.com/2016/06/quick-look-integer-promotion-c/
integer promotion in C
https://www.cryptologie.net/article/418/integer-promotion-in-c/
Integral promotion
https://stackoverflow.com/questions/10660758/integral-promotion
自己参照
C言語(C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a
C言語:未定義、未規定、処理系定義
https://qiita.com/kaizen_nagoya/items/f416efd38aaaec7f8230
最新のC言語規格の案
https://qiita.com/kaizen_nagoya/items/f416efd38aaaec7f8230
N2731 (1) 3.14 memory location
https://qiita.com/kaizen_nagoya/items/8d554cac54cf97d9745c
8.2 — Floating-point and integral promotion
https://www.learncpp.com/cpp-tutorial/floating-point-and-integral-promotion/
C++ Support(0)
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514
Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0
Ethernet 記事一覧 Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794
Wireshark 一覧 wireshark(0)、Ethernet(48)
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0
線網(Wi-Fi)空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001
OSEK OS設計の基礎 OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3
Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8
なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2
言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4
プログラムちょい替え(0)一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394
TOPPERSまとめ #名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451
docker(0) 資料集
https://qiita.com/kaizen_nagoya/items/45699eefd62677f69c1d
Qiita-dockerお宝鑑定団
https://qiita.com/kaizen_nagoya/items/509e125263559b5aed5b
The C++ Standard Library: clang++とg++でコンパイルしてみた(まとめ):14件
https://qiita.com/kaizen_nagoya/items/9bdfaa392443d13e5759
C++17 - The Complete Guide clang++とg++でコンパイルしてみた(まとめ):4件
https://qiita.com/kaizen_nagoya/items/c000f307e642990781e1
C++N3242, 2011, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318
C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/
C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010
C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91
Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76
プログラマによる、プログラマのための、統計と確率のプログラミングとその後 統計と確率一覧(0)
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909
一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
文書履歴(document history)
ver. 0.01 初稿 20211201
ver. 0.02 URL 追記 20240519
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.