コンテンツ
1つ:符号付き/符号なしキーワード
符号付き/符号なしキーワードを正式に理解する前に、割り当てられたメモリにデータがどのように格納されるかを深く理解する必要があります。最初に理解する:
整数のバイナリ表現には、次の3つの表現があります。元のコード----逆コード----補完コード
メモリは2の補数で保存されます!
整数:正の数/負の数正の数:元のコード
の補数と同じ
負の数:元のコード:数の正と負に応じて、直接書き込まれたバイナリは元のコードの補数
です:符号ビットは残ります変更されず、他のビットはビットごとに反転されます
。補完コード:逆コードのバイナリシーケンス+ 1、つまり
、補完コードの符号ビットは0、正の数は1、負の数は
15です。
0000000000000000000000000001111 ----->元のコード-補数コード-補数コードの最上位ビットは符号ビット0、正の数
-15:
//1000000000000000000000000001111----->元のコード
//
1111111111111111111111111110000----- >補数コード//11111111111111111111111111110001----->補数コード
1000000000000000000000000000001010元
のコードの逆数コードは16進数に変換された同じ4
つのバイナリを補完します000 0000
。
メモリに2の補数が格納されるのはなぜですか?
コンピュータには加算器しかありません。
たとえば、1 +(-1)= 0です。
元のコードが追加された場合:
00000000000000000000000000000001元のコード110000000000000000000000000000001元の コード
-1--
-------------------------------
加算10000000000000000000000000000010---->-2 err
補数加算を使用する場合:
000000000000000000000000000000011の補数
111111111111111111111111111111111111111111111111111111111111111111111111111111111111補数コード
----------------------------------
10000000000000000000000000000000----> 0の正しい
元のコードを追加して、コードを補完します。補数:
1
:
1000000000000000000000000000001元のコード
111111111111111111111111111111110
コード
にプラス1を
111111111111111111111111111111111111111111111111111111111
保存
111111111111111111111111111111110反転
反転
10000000000000000000000000000001元のコード
方法II:
10000000000000000000000000000001元のコード
反転
11111111111111111111111111111110反転
プラス1
11111111111111111111111111111111補数
否定
10000000000000000000000000000000
プラス
110000000000000000000000000000001プリミティブ
合計:
取得した元のコード否定+1補数、補数コードを反転
実際には、符号なしの数値を次のように定義します。
#include<stdio.h>
int main()
{
unsigned int b = -10;
printf("%d\n", b); // -10
printf("%u\n", b); // 4294967286
return 0;
}
解析:
このコードでは、符号なしの数値b=-10の変数を定義します。
データを最初に保存してから取得する必要があり、補完コードが保存され、元のコードが取得されます。
私たちは皆、メモリが2の補数を格納することを知っています
-101000000000000000000000000001010
元のコード
11111111111111111111111111110101逆コード
11111111111111111111111111110110補完コード%dの形式で出力される場合、この時点では符号付きの数値と見なされ、上記の補数は元のコード(-10)に変換されます。
%uの形式で出力される場合、これは符号なし数値であり、符号なし数値の最上位ビットは符号ビットではなくなります。このとき、元のコードの補数は同じであり、上記の2つの補数は10進数に変換されます特大の数値です4294967286
2:キーワードを切り替える
基本的な構文構造:
switch (整型变量 / 常量 / 整型表达式)
{
case var1:
break;
case var2:
break;
case var3:
break;
default:
break;
}
知らせ:
// //決定能力のある文法構造には、decision+branchが必要です。
////ケース自体が決定に使用されます
////ブレークはブランチ機能に使用されます
#include<stdio.h>
int main()
{
int day = 0;
while (1)
{
scanf("%d", &day);
switch (day) // 整型||整形表达式||常量
{
case 1: // case本身是用来判定的
printf("星期1\n");
break; //break用来进行分支功能
case 2:
printf("星期2\n");
break;
default:
printf("请输入正确的数字\n");
break;
}
}
ケースで複数のステートメントを実行するには:
ケースステートメントの1つの後に、複数の関連ステートメントを出力できます
case 3:
printf("星期3\n");
printf("星期3\n");
printf("星期3\n");
printf("星期3\n");
printf("星期3\n");
break;
ただし、ケースの後に変数を定義し、それにアクセスする必要がある場合は、次のようになります。
コンパイラがエラーを起こすことを見つけるのは難しいことではありませんが、case3全体の後に中括弧を追加すると
この時点で、コンパイラは正常に実行できます。もちろん、上記の操作を実行する場合は、次の関数を作成することをお勧めします。
複数のケースでステートメントを実行する場合:
#include<stdio.h>
int main()
{
int day = 0;
while (1)
{
scanf("%d", &day);
switch (day) // 整型||整形表达式
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("周内\n");
break;
case 6:
case 7:
printf("周末\n");
break;
default:
printf("请输入正确的数字\n");
break;
}
}
return 0;
}
注:変数の直後に大文字小文字を区別することはできませんが、マクロを使用して変数を定数変数として定義でき、デフォルトステートメントの位置を任意の位置に配置できます。
#include<stdio.h>
#define A 10
int main()
{
const int a = 10;
switch (a)
{
//case 10:
//case a: err
//case 后面不能直接跟变量,但可以用宏定义变量即为常变量
case A:
printf("hello bit!\n");
break;
default :
break;
}
return 0;
}
要約:
1. switch構文構造では、判定関数はcaseで完了し、分岐関数はbreakで完了し、デフォルトの処理例外です。
2.case:execute statement == 1:n、case複数のステートメント(必要に応じて変数を定義できません、{}、関数)break
3.ケース:ステートメントの実行= = n:1、複数のケースは後でブレークを書き込みません
4.デフォルト:どこにでも表示でき、最後に推奨
5.case:not:const、通常の変数、ケースをレイアウトする良い方法があることをお勧めします
3:キーワードを中断/続行
その間
最初にコードの一部を見てください(ブレーク)
breakの機能がループから飛び出すことであることを見つけるのは難しいことではありません。breakをcontinueに置き換えると
continueの機能は、この(1つの)ループを終了することです。このループを終了するため、continueはwhile条件にジャンプして、ループを決定します。
一方を行います
いくつかの擬似コードを見てみましょう
do {
printf("hello\n");
if (flag)
{
continue;
}
} while (cond);
do whileで、continueを使用します。どこにジャンプし続けますか?
条件付き判断はどこにありますか、続行はにジャンプします。したがって、継続はwhile(cond)条件付き判断にジャンプします。
にとって
別の擬似コード
forループでは、continueを使用します。continueはどこにジャンプしますか?
この時点で、forループの継続が条件が更新されるi++にジャンプすることを見つけるのは難しくありません。
要約:
whileループdowhileループ使用は条件を決定し続けます
forループは条件を更新することです
4:gotoキーワード
コードを見てください:
ジャンプダウン:
#include<stdio.h>
int main()
{
goto end;
printf("hello 1\n");
printf("hello 2\n");
printf("hello 3\n");
end: // 标签
printf("hello 4\n"); // hello 4
printf("hello 5\n"); // hello 5
printf("hello 6\n"); // hello 6
return 0;
}
跳ね上がる:
#include<stdio.h>
int main()
{
end: // 标签
printf("hello 1\n");
printf("hello 2\n");
printf("hello 3\n");
goto end;
printf("hello 4\n");
printf("hello 5\n");
printf("hello 6\n");
// 死循环
// goto语句在代码块中可以跳转
return 0;
}
場合:
#include<stdio.h>
int main()
{
int i = 0;
start:
printf("[%d] goto running...\n", i);
i++;
if (i < 3)
{
goto start;
}
printf("goto end...\n");
return 0;
}
gotoステートメントは、このコードブロック内でのみ使用でき、ファイル間や関数の使用には使用できません。!!
要約:
//多くの企業はgotoの使用を禁止していますが、それでもこの問題を柔軟に処理します。gotoは多くの問題を解決するのに奇跡的です。
// gotoの使用シナリオは少なく、通常は使用されていないと考えられます。しかし、gotoを知っている必要があり、必要なときに使用できる必要があります