GNU/Linux >> Linux の 問題 >  >> Linux

Cプログラミングチュートリアル4-変数とメモリ

これまでのこのチュートリアルシリーズでは、基本的なCプログラムの作成方法と実行方法、プリプロセッサとは何か、および変数の基本について説明してきました。それでは、変数を少し深く掘り下げて、メモリの側面について説明しましょう。

これまでのすべてのチュートリアルをすでに完了している(またはこのチュートリアルを理解するために必要な基本的な知識がある)と仮定して、以前のチュートリアルの1つで使用した簡単なコード例から始めましょう。

#include <stdio.h>

int main (void)
{
int num = 0, temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
int result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %d is %d\n", num, result);

return 0;
}

ご覧のとおり、このプログラムは、ユーザーが入力した数値の階乗を計算します。

これで、5や6のような小さい整数の場合、このプログラムは正常に機能します。階乗の結果が正しく出力されます。ただし、13番で試してみたとしましょう。次のような結果が得られます。

Factorial of 13 is 1932053504

しかし、13の階乗は6227020800であるため、これは正しくありません。したがって、当然のことながら、問題は、なぜ私たちのプログラムが間違った答えを出したのかということです。答えは、int変数がシステムで占めるメモリの量にあります。

今日のほとんどのシステムでは、intは4バイト(または32ビット)のメモリを占有します。プログラムで次の行を使用して、システムでintが占めるバイト数を知ることができることに注意してください。

printf("\n int size in bytes is: %d ", sizeof (int));

また、int変数は負の値も格納できるため、格納できる値の範囲は-2,147,483,648から2,147,483,647までさまざまです。

ここで、階乗13は、int変数が保持できる最大値よりもはるかに大きいため、プログラムは誤った出力を返します。プログラムを修正する唯一の方法は、6227020800を保持できる可変タイプを使用することです。

より大きな正の整数値を保持する場合は、「unsigned int」を使用できます。これにより、0〜4,294,967,295の範囲の値を格納できます(このタイプの変数がシステムで4バイトを占めると想定)。ただし、ここでは、13の階乗が最大容量を超えているため、「unsignedint」でも機能しません。

したがって、ここでの救世主は、8バイトまたは64ビットのメモリを占有する「longlong」になります。改訂されたプログラムは次のとおりです。

#include <stdio.h>

int main (void)
{
long long num = 0; long long temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
long long result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %lld is %lld\n", num, result);

return 0;
}

printfまたはscanfで「longlong」変数を識別する方法は、%lld(または場合によっては%I64d)を使用することです。この変更されたプログラムが生成する出力は次のとおりです。

Factorial of 13 is 6227020800 

どちらが正しいですか。

これで、「int」の制限と、「unsignedint」および「longlong」を使用してそれを克服する方法がわかりました。 '長いことを覚えておいてください。 'も可変型ですが、今日のほとんどのシステムでは、intとlongの両方が4バイトを占めます。

そうです、「int」、「unsigned int」、「long long」は整数用ですが、浮動小数点数には「float」と「double」があります。 Floatは32ビットで、小数点以下7桁の精度ですが、doubleは64ビットで、小数点以下15桁の精度です。

浮動小数点数についての言及は、ここで別の重要なポイントに私をもたらします。それは除算に関連しています。これを理解するために、簡単なCコードの例を見てみましょう。

int main (void)
{
int a=5, b=10;

printf("\n a/b is %d", a/b);

return 0;
}

したがって、このプログラムは何もしませんが、aをbで除算するか、5を10で除算します。

実生活では、5/10の結果を誰かに尋ねると、ほとんどの場合、答えとして0.5が得られます。しかし、ここでは、答えはゼロ(0)になります。理由は、「a」と「b」の両方が整数であるため、それらの除算の結果も整数と見なされるため、浮動部分は無視されます。

浮動小数点部分を保持するには、「a」と「b」の両方が浮動小数点変数であることを確認する必要があります。

#include <stdio.h>

int main (void)
{
float a=5, b=10;

printf("\n a/b is %f", a/b);

return 0;
}

この場合、出力は0.5になります。

このチュートリアルでは、可変サイズと、それが値の保存にどのように影響するかについて説明しました。 int、unsigned int、long long、float、およびdoubleをいつどのように使用するかについての良いアイデアが得られたと思います。次のチュートリアルでは、文字型変数と配列について説明します。


Linux
  1. メモリの監視と管理

  2. Cでアトミック変数を使用するには?

  3. カーネルプログラミングで unsigned int の代わりに u8 u16 u32 u64 が使用される理由

  1. LinuxCプログラミングチュートリアルパート12-代入演算子と条件式

  2. Linux Cプログラミングチュートリアルパート11-算術演算子、リレーショナル演算子、および論理演算子

  3. tmpfs の使用とサイズ変更

  1. Linux nice and reniceコマンドチュートリアル(7例)

  2. Cプログラミングチュートリアルパート3-変数の基本

  3. LinuxCプログラミングチュートリアルパート15-2秒の補数と負の数