データ ストレージとそれに関連する典型的な例には、メモリ内の浮動小数点数の格納に関する詳細な説明が含まれています

データ保存例

例一

#include <stdio.h>
int main()
{
    
    
	int a = -20;
	unsigned int b = 10;
	printf("%d", a + b);
	return 0;
}

aには-20が格納され、補数コードには-20が格納されます a+bを計算する際、aはunsigned intに算術変換されますが、aの場合はunsigned intに変換してもaに格納される値は変わりません, なぜなら、 a の値はまだ 4 バイトであり、印刷時に %d の形式で印刷される必要があるため、その補数を印刷する必要があり、最終的には -10 として計算できます。印刷用の %u は正の数とみなされます。つまり、元のコードは補数コードであり、非常に大きな数値を出力します。

例二

#include <windows.h>
int main()
{
    
    
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
    
    
		printf("%u\n", i);
		Sleep(1000);

	}
	return 0;
}

i は unsigned int 型なので、i が負の数の場合でも補数が格納され、その補数が i に格納されます。i から見ると、i は非常に大きな数、たとえば 1 を格納することになります
。 i の角度、格納されている値はすべて 1 です。%u で出力するとすべて 1 が出力されますが、%d で出力すると補数コードが元のコードに変換され、-1 が出力されます。と出力されますが、条件が i>0 であると判断された場合、i は 0 に比べて非常に大きい数であり、i は常に 0 より大きいため、無限ループが発生します。

例 3

int main()
{
    
    
char a[1000];
int i;
for(i=0; i<1000; i++)
{
    
    
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}

char型の範囲は-128~127なので、
配列aには-1から徐々に格納され、-128まで格納されるとi++は127となり、その後0まで徐々に減少していき、終了記号となります。文字列の '\ 0' は、その ASCII 値が 0 です。つまり、0 に遭遇すると、合計 255 個の数値があり、出力は 255 になります。

例 4

#include <stdio.h>
unsigned char i = 0;
int main()
{
    
    
for(i = 0;i<=255;i++)
{
    
    
printf("hello world\n");
}
return 0;
}

iの範囲は0~255で、iに256を格納するとインターセプト後の8桁が全て0になるため無限ループとなります。

浮動小数点数をメモリに保存する

浮動小数点数は整数のようには格納されません。特別な格納方法があります。任意の浮動小数点数 Vは、 (-1)^S * M * 2 ^E
のように記述できます。S が 0 の場合、V は次のようになります。 1 の場合、V は負の数、M は有効数、E は指数を表します。たとえば、5.5 は (-1)^0 * 1.011 * 2 ^2符号ビット Sと書くことができます。 :0有効数 M:1.011指数ビット E:2 float 型の場合 型は 32 ビットあり、1 ビットが符号ビット、8 ビットが指数ビット、残りの 23 ビットが有効な数値になります double 型の場合64 ビットあり、1 ビットは符号ビット、11 ビットは指数ビット、残りの 52 ビットは有効な数です。Sビットには正または負を意味する 0 または 1 が格納されます。E インデックス ビット指数のみを格納します。M は 1.xxxxxx と記述できるため、小数点以下の数値が格納され、その時点で出力されます。欠落した値は自動的に埋め戻されますが、一部の浮動小数点数は正確に保存できません。たとえば、 , 5.3をfloat型で格納した場合、5.3の小数点以下の3は常に2進数に変換されるため、格納される値は5.30000019となります. 3に結合できるのはドットのみで、有効な数は23ビットまでしか格納できませんので、エラーが発生します指数 E を格納する場合、E は符号なし整数ですfloat 型 E の値の範囲は 0 ~ 255、double 型 E の場合、値の範囲は 0 ~ 2^11 - 1、ただし、0.5 が格納されると、 (-1)^0 1.0 (2 ^ -1)に変換され、E は -1 となるため、8 桁の E の場合、E に格納される実際の値は中間値で加算する必要があります。数値 127。11 桁の E の場合、E の実際の値に 1023 を加算する必要があります。指数 E を引き出すには、3 つのケースがあります。















1. E がすべて 0 またはすべてではない 1.
E の値から 127 または 1023 を引いて、実指数を取得します2.
E がすべて 0 の場合、
+/-1.xxxxx 2^-127 を意味します。数値を 0 に変換すると、この時点では E を 1 ~ 127 (1 ~ 1023) として直接分析し、M は 0.xxxx
3 に復元されます。 E がすべて 1 の場合
、+/- 1.xxxxxx
2^128 を意味します。非常に大きな数字です

浮動小数点メモリストレージの典型的な例

int main()
{
    
    
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}

プラスチックの観点から9を格納すると、元の逆補数コードは0000000000000000000000000001001になります。
これをfloat型の観点から取り出すと、S:-1、M:000000000000000000001001、E:00000000となるので、インデックスはそのまま1-127に戻ります。 , M は 0.0000000 0000000000001001 なので、9,0.000000 と出力されます。
浮動小数点数の観点から 9.0 を n に格納するには、9 は (-1)^0 1.001 2 ^3 に変換され、メモリに格納されるのは0
00000011 0010000000000000000となります。 0000
取り出してください。非常に大きな数です。float
型の観点から取り出して、元に戻します (-1)^0 1.001 2 ^3、出力される値は 9.000000 です。

おすすめ

転載: blog.csdn.net/wan__xia/article/details/129174264