「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 週刊ブログ: 今週出会った 4 つの興味深いこと

週刊ブログ: 今週出会った 4 つの興味深いこと

2024 年 11 月 8 日に公開
ブラウズ:187

1. VS Code でのファイル名の混乱を避ける

VS Code で C ファイルを作成するとき、最初にファイルに .c.cpp という名前を付けました。プログラムが完了した後、実行中にエラーが発生しました。 30 分間のトラブルシューティングの後、問題はファイル名
にあることがわかりました。 .c 拡張子により、IDE がそれを C プログラムとして誤って認識し、VS Code がコードをコンパイルするために g (C コンパイラ) ではなく gcc (C コンパイラ) を使用するようになりました。

Weekly Blog: Four Interesting Things I Encountered This Week

キャプション: なんと愚かなことでしょう!

  • 解決策:tasks.json ファイルで、「コマンド」ラインを gcc から g .
  • に変更します。
  • 学んだ教訓: 不必要な混乱を避けるために、C ファイルには明確な .cpp 拡張子を使用してください。

2. Java のクロスプラットフォーム設計哲学

Java の設計哲学は、従来のコンパイル言語とは大きく異なります:

従来のコンピレーション:

  1. C のような言語は、特定の目的のために直接マシンコードにコンパイルされます。 プラットフォーム (例: Windows、Mac、Linux)
  2. 結果の実行可能ファイル (.exe) はターゲット プラットフォームでのみ実行できます

Java のアプローチ:

  1. コンパイラは中間コード(バイトコード)を生成します
  2. このバイトコードは、Java 仮想マシン (JVM) がインストールされている任意のプラットフォームで実行できます
  3. JVM はバイトコードを現在のプラットフォームのマシンコードに変換する役割を果たします

この設計は「一度書いたらどこでも実行できる」という目標を達成しますが、C 実行可能ファイル (.exe ファイル) は単一プラットフォームでの実行に限定されます。

  • 利点:同じプログラムを変更せずに異なるコンピュータで実行できます

  • 欠点:プロセスに追加のステップがあるため、従来の方法と比べてコンパイルがわずかに遅くなる可能性があります

一度書けばどこでも実行可能

                             ---------James Gosling

3. 2 つの一般的なコンパイル モード

  • デバッグ モードはデバッグを目的としており、最適化はほとんどありません。主にプログラムのデバッグに使用されます。
  • リリース モードは主にリリース バージョンの生成に使用され、最適化に重点を置き、基本的なデバッグ機能のみを保持します。

Weekly Blog: Four Interesting Things I Encountered This Week

4. 低レベルの観点からの強制型キャストの理解

リトルエンディアン: 最下位バイトが最下位アドレスに格納されます。この記憶方法は、下位アドレスから上位アドレスに向かって行われる CPU メモリの読み取りを容易にするために登場しました。興味深いことに、これは人間が通常数字を書くのとは逆です。
例えば
329933 のバイナリ表現は 00000000 00000101 00001000 11001101
リトルエンディアンストレージ: 11001101 00001000 00000101 00000000
見てわかるように、リトル エンディアンはバイナリ表現のバイトの順序を逆にします。ただし、各バイト内のビット順序は変更されないことに注意することが重要です。

強制型キャストを理解するための楽しいゲーム

型キャストを導入するための私のお気に入りの実験です!

# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

出力:

329933
-51

なぜ -51 が出力されるのか不思議です?

説明

  1. (char*)&a は int の最初のバイトを指します。最初のバイト 11001101 は文字として解釈されます。
  2. 最上位ビット 1 は負の数を示し、2 の補数変換後、-51 が得られます (2 の補数に詳しい友人なら、それが実際に -51 を表すかどうかを確認できます)

これは偶然ですか?さらに 2 つの例を試してみましょう

printf("%d\n",*(q 1));
printf("%d\n",*(q 2));

試してみる:

  1. 上記のコードを実行して、出力を観察してください。
  2. 2 番目と 3 番目のバイトでこのような出力が生成される理由を考えてみましょう。 コメントセクションでお気軽にご相談ください。
  3. 他のデータ型に強制型キャストを適用できますか?ぜひ試してみてください!

追加情報: 2 の補数

強制型キャストを実行すると、(char)p は 4 バイト int の最初のバイトのアドレス (11001101) を指します。
一番左の 1 は負の符号を表し、負の数であることを示します。 2 の補数を適用すると、0110011 (最後の 7 ビット)

が得られます。

(注: 正の数の場合、2 の補数は単に 10 進数の 2 進表現です。負の数の場合、2 の補数は、左端 (最上位) ビットを除くすべてのビットを反転し、1 を加算することによって取得されます。 )

これを 10 進数に変換すると、-51 になります。面白いでしょう?

2 の補数の利点:

  1. 加算器のみを使用して正の型と整数型の両方を計算できるため、減算器の必要性がなくなり、ハードウェアの必要性が簡素化されます。
  2. ゼロの一意のバイナリ表現を提供します。 10000000 は -0 ではなく -128 を表し、00000000 は 0 ではなく 0 を表します。

なぜ -128 なのか疑問に思う人も多いでしょう。答えがわかったら、コメント欄でお気軽に共有してください。これは他の人を助けるだけでなく、自分の考えを整理するのにも役立ちます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-encountered-this-week-eo9?1 権利侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3