[解決済み] C言語のデータ型は、どのようにして「ほとんどのコンピュータで直接サポート」されるのですか?
質問
K&Rを読んでいます。 "Cプログラミング言語" を読んでいて、こんな文章に出会いました[Introduction, p.3]。
C 言語が提供するデータ型と制御構造は、ほとんどのコンピュータで直接サポートされているため 自己充足的なプログラムを実装するために必要なランタイムライブラリはごくわずかです。
太字の意味は何でしょうか?以下のようなデータ型や制御構造の例はありますか? は がコンピュータによって直接サポートされているデータ型や制御構造の例はありますか?
どのように解決するのですか?
はい、直接サポートされていないデータ型があります。
多くの組み込みシステムでは、ハードウェア浮動小数点演算ユニットがありません。 そのため、このようなコードを書くと
float x = 1.0f, y = 2.0f;
return x + y;
こんな感じに変換される。
unsigned x = 0x3f800000, y = 0x40000000;
return _float_add(x, y);
この場合、コンパイラや標準ライブラリは
_float_add()
の実装を提供しなければならず、組み込みシステムのメモリを消費します。 もしあなたが本当に小さなシステムでバイトを数えているのであれば、これは積み重なる可能性があります。
もう一つの一般的な例は、64 ビット整数 (
long long
を使用) であり、これは 32 ビットシステムでは直接サポートされていません。 古い SPARC システムでは整数の乗算をサポートしていなかったので、乗算はランタイムが供給しなければなりませんでした。 他の例もあります。
他の言語
それに比べて、他の言語はもっと複雑なプリミティブを持っています。
例えば、Lispのシンボルは、Luaのテーブル、Pythonの文字列、Fortranの配列などと同様に、多くの実行時サポートを必要とします。 C の同等の型は通常、標準ライブラリにまったく含まれていないか (標準のシンボルやテーブルがない)、はるかに単純で実行時サポートをあまり必要としません (C の配列は基本的に単なるポインタ、ヌル終端の文字列はほぼ同様に単純です)。
制御構造
C言語で欠けている顕著な制御構造は、例外処理です。 非局所的な終了は
setjmp()
と
longjmp()
これらはプロセッサの状態のある部分を保存したり復元したりするだけです。 それに比べて、C++ ランタイムはスタックを歩き、デストラクタと例外ハンドラを呼び出さなければなりません。
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
関数 'malloc' の暗黙の宣言に対する解決策
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み】CとC++におけるユニオンの目的
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?