ああ、データはこうやって保存されているんですね、超詳しいですね!!!


序文

今日の記事では、コンピューター内のデータの保存について紹介します。一緒に学びましょう。


1. データ型の分類

整数型
1.short
には unsigned short、signed short が含まれます
2.int
には unsigned int、signed int が含まれます
3.long
には unsigned long、signed long が含まれます
4.char
には unsigned char、signed char が含まれます
unsigned は符号なし型を意味し、それより大きい値のみを表すことができますゼロ以上 符号
付きの数値は符号付きタイプを示し、負の数値の最上位ビットが符号ビットであることを示すことができます。最上位ビットが 1 の場合、それは負の数値であり、最上位ビットが 0 である場合、正の数です
char の型が unsigned char か signed char かはプラットフォームとコンパイラによって決定されます 決定されており、short、int、long はデフォルトですべて符号付き整数になります 浮動小数点

1.float
2.double
3 .long double

2. メモリへのデータ保存

1. 整数データのメモリへの保存

1. 3 つのコンピュータ バイナリ表現方法、元のコード、逆コード、補数コード\n\n元のコード: 値を正と負の数の形式でバイナリに直接変換し、元のコードを取得します。 -7 元のコードは
10000000000000000000000000000111

7 の元のコードは 0000000000000000000000000000111 です

逆コード: 元のコードの符号ビットを変更せず、他のビットをビットごとに反転します。
-7 の逆コードは 111111111111111111111111111111000 です。

7 の逆数は 00000000000000000000000000000111

補数コード: 逆コードの符号ビットは変更されず、
+1 -7 の補数コードは 1111111111111111111111111111111001 となります。

7 の補数は 0000000000000000000000000000111

正の数の元のコード、逆コード、および補数コードは同じであり、負の数は上記の規則に従うことに注意してください。

コンピューターはなぜ 2 の補数を使用してデータを保存するのでしょうか?
: 補数コードはコンピュータで負の数を表現する問題を解決し、最終的にはコンピュータの減算の問題を解決します。


2. 浮動小数点データのメモリへの保存

メモリ内では、浮動小数点数は符号ビット、指数ビット、仮数ビットの順に格納されます。
国際標準 IEEE (電気電子工学研究所) 754 によると、任意の 2 進浮動小数点数は次の形式で表現できます: (-1) ^S * M * 2^
E (つまり、科学表記法で表現されます) )、float 型は 32 ビット浮動小数点数に属する 4 バイトを占め、最上位ビットは符号ビット、中間の 8 ビットは指数ビット、次の 23 ビットは仮数ビットに属します。ここで、S は符号ビット、E は指数ビット、M は仮数ビットです。
double 型は 8 バイトを占め、64 ビット浮動小数点数に属します。最上位ビットは符号ビット、中間の 11 ビットは指数ビット、次の 52 ビットは仮数ビットです。ここで、S は符号ビット、E は指数ビット、M は仮数ビットです。
このうち、M の範囲は 1.0 ~ 2 (2 は取れません) なので、最初の 1 桁は 1 でなければなりません。32 ビット浮動小数点数の場合、次の 23 桁には 1 を格納する必要はなく、23 を格納する必要があります。小数点以下の桁を保存できるようになり、精度が向上します。1 を保存すると、小数点以下の桁を保存できるビットは 22 ビットだけになります。取り出すときは前に 1 があることを忘れないでください。

E のデポジット:
E は符号なし整数で、E が 8 ビットの場合、値の範囲は 0 ~ 255、E が 11 ビットの場合、値の範囲は 0 ~ 1023 ですが、科学的表記法の E は負の数を持つことができます
したがって、IEEE 754 では、メモリに格納するときに E の実際の値に中間値を加算する必要があると規定しています。8 ビット E の場合、中間値は 127 ビットです。11 ビット E の場合、中央値は 1023 です。

E の削除:

E はすべて 0 またはすべて 1 ではありません\n\n 中間の値を引いた値です。8 ビット E の場合、中間の値は 127 です。11 ビット E の場合、中央値は 1023 です。
E はすべて 0:

1 ~ 127 (または 1 ~ 2023) に等しい E は実数値であり、有効数 M は最初の 1 と加算されず、10 進数の 0.XXXXXXXXXX に減算されるため、±0 を表すために次のようになります。 0 に近い 非常に小さい数値。

E はすべて 1 です。

255 から中間値 (127) を引いたもの = 128 として取り出します。M が 0 になる傾向がある場合、128 に 2 を掛けると、ほぼ無限大になる傾向があります。これは、±無限大を意味します。

たとえば、
5.5 進浮動小数点数は 2 進数
で書かれます: 101.1
、つまり S=0; E=2; M=1.011 E+127; 正の数なので S=1
; として保存されます: 0100 0000 1011 0000 0000 0000 0000 0000
対応する 16 進数は次のとおりです: 0x 40 b0 00 00

メモリ内に表示します:
ここに画像の説明を挿入
例 2:
-0.5——10 進浮動小数点数 2 進数
: -0.1
S=1; E=-1; M=1.0
S に保存: 1 E+127:011 1111 0 M: 000 0000 0000 0000 0000 0000
は最終的に次のようになります:
1011 1111 0000 0000 0000 0000 0000 0000 は
16 進数に対応します:
0x bf 0 0 0 0 0 0 は
メモリ内では次のようになります。
ここに画像の説明を挿入


3. ビッグエンディアンストレージとスモールエンディアンストレージの概要

ビッグエンディアン (ストレージ) モードは、データの下位ビットがメモリの上位アドレスに格納され、データの上位ビットがメモリの下位アドレスに格納されることを意味します

リトルエンディアン (ストレージ) モードは、データの下位ビットがメモリの下位アドレスに格納され、データの上位ビットがメモリの上位アドレスに格納されることを意味します

3. 重要な例: 端のサイズを決定するプログラミング

int check_Sys()
{
    
    
	int n = 1;//1的二进制补码中1在数据地位,将他的地址强转为字符型,每次就只能访问一个字节,如果拿到1,则说明1在地址低位存储为小端,否则在高位存储为大端
	return *((char*)&n);
}
int main()
{
    
    
	if (check_Sys)
	{
    
    
		printf("小端!\n");
	}
	else
	{
    
    
		printf("大端!\n");
	}
	return 0;
}

1 の 2 の補数では、1 がデータ位置にあり、そのアドレスは文字型に強制され、一度に 1 バイトのみにアクセスできます。1 が得られた場合は、1 が下位ビットに格納されていることを意味しますアドレスのリトル エンディアンとして格納されます。それ以外の場合は、ビッグ エンディアンとして格納される上位ビットに格納されます。

デモを実行します。
ここに画像の説明を挿入
作成者のコンピュータはリトル エンディアンです。

要約する

今日の共有は終わりました。皆さんのお役に立てれば幸いです。ご視聴いただき、学んでいただきありがとうございました。

おすすめ

転載: blog.csdn.net/m0_71214261/article/details/132119684