C言語でのデータストレージ-オン
コンテンツが大きいため、データの保存という2つの部分に分かれています。できるだけ早く急いで行きます。気に入るかどうかは関係ありませんが、それを見た読者の皆様には、私が書いた記事を数分間見ていただければ幸いです。
まず、データ型とは何かを紹介します
- 形成外科
char//其在内存中以ASCII码的形式存储,ASCII码为整数,所以归为整形类
signed char//有符号
unsigned char//无符号
short
signed short
unsigned short
int
signed int
unsigned int
long
signed long
unsigned long
long long
signed long long
unsigned long long
//仅写出char/short/int/long/long long时通常都会被理解为有符号型
- 浮動小数点クラス
float
double
long double
- 構築型(カスタム型)
数组类型-例如arr[10]={
0}
结构体类型-struct
枚举类型-enum
联合类型-union
- ポインタ型
int *pi;
char *pc;
short *ps;
float *pf;
void *pv;//空类型指针
- 空のタイプ
void表示空类型/无类型
通常应用于函数的返回类型、函数的参数、指针类型。
これらのタイプを作成することの重要性は次のとおりです。
- さまざまなタイプを使用すると、開いているメモリスペースのサイズが決まります(スペースのサイズによってアプリケーションの範囲が決まります)
- タイプによって、メモリスペースを見る視点が決まります。
次に、メモリ内のシェーピングのストレージ形式について説明します。
変数を作成する場合は、メモリ内のスペースを開く必要があります。開いたスペースのサイズは型に関連しているので、変数を見てみましょう。どのようにメモリに格納されますか。
比如
int a=20;
int b=-10;
我们已经知道a,b会占内存四字节的空间,那它们是如何存储的呢?
まず、元のコード、逆コード、補完コードの概念を理解しましょう。
コンピュータで符号付き数値を表すには、元のコード、逆数コード、補数コードの3つの方法があります
。符号ビットと値ビットには2つの部分があります。符号ビットは0を使用して「正」を示し、 1は「負」を示し、数値ビットの3つの表現は異なります。
- 元のコード:バイナリを正と負の数の形式でバイナリに直接変換します
- 反転コード:元のコードの符号ビットは変更されず、他のビットは順番に反転できます。
- 補数コード:逆コードに1を追加します。
上記は、負の数の元の逆補数を見つける方法であり、正の数の元の逆補数は同じです。
シェーピングの場合:メモリに保存されているデータは実際には補数です
その理由は
コンピュータシステムでは、値は常に補数で表され、保存されます。その理由は、符号ビットと値フィールドを補数コードを使用して均一に処理できると同時に、加算と減算も均一に処理できるためです(CPUには加算器のみがあります)。さらに、補数コードと元のコードは相互に変換され、操作プロセスは同じです。追加のハードウェア回路。
正の数と負の数の例を表示する
次に、これから別の疑問が生じます。上の図の補数の格納順序がメモリの格納順序と異なるのはなぜですか。
次に、この問題を調査するために、別の栗を取り上げましょう。今、0x 11 22 3344という数字を保存する方法を考えてみましょう。
ビッグエンディアンストレージ:データの下位バイト(上の図の最初のタイプ)のコンテンツを上位アドレスに格納し、上位バイトのコンテンツを下位アドレスに格納します。
リトルエンディアンバイトオーダーストレージ:データの下位バイト(上図の2番目のタイプ)の内容を下位アドレスに格納し、上位バイトの内容を上位アドレスに格納します。
これは、コンピュータシステムでは、単位としてバイトを使用し、各アドレス単位が1バイトに対応し、1バイトが8ビットであるためです。ただし、C言語では、8ビット文字に加えて、16ビットのshort型、32ビットのlong型(特定のコンパイラによって異なります)、および8ビットを超えるプロセッサ(16など)があります。 -ビットまたは32ビットレジスタ幅が1バイトより大きいため、複数バイトの配置方法に問題があるはずです。これにより、ビッグエンディアンストレージモデルとリトルエンディアンストレージモデルが生まれました。
たとえば、16ビットのショートタイプx、メモリ内のアドレスは0x0010、xの値は0x1122の場合、0x11が上位バイト、0x22が下位バイトになります。ビッグエンディアンモードの場合、下位アドレス(0x0010)に0x11を配置し、上位アドレス(0x0011)に0x22を配置します。リトルエンディアンモードは正反対です。一般的に使用されるX86構造はリトルエンディアンモードですが、KEILC51はビッグエンディアンモードです。多くのARMおよびDSPはリトルエンディアンモードです。一部のARMプロセッサは、ハードウェアによってビッグエンディアンモードまたはリトルエンディアンモードを選択することもできます。
プログラミングに関する小さな質問があります。現在のプラットフォームのストレージモードがビッグエンディアンかリトルエンディアンかを判断するプログラムを設計してください。
#include <stdio.h>
int check()
{
int a = 1;
return *(char*)&a;//先将int类型的指针强制转化为char,再解引用传回a中第一个字节数据
}
//上面拆开写就是这种
//int check()
//{
// int a = 1;
// char *p = (char*)&a;
// return *p;
//}
int main()
{
int a = 1;
if (check() == 1)//如果返回的是1,就证明低位字节在低地址上
{
printf("小端\n");
}
else//如果返回的是0,就证明低位字节在高地址上
{
printf("大端\n");
}
return 0;
}
C言語データの保存-これで終わりです。
それを見た大物がたくさん見せてくれることを願っています。