lecture 0: Scratch
Q: コンピュータはバイナリで表されるけど、数字と文字はどうやって区別してるの??
ASCII Codeでの「A」→ 01000001
数字の「65」→ 01000001
ビット列だと全く同じだけど、数字か文字をどう区別してるんだ??
A: プログラムやデータ型によって指定している
- データ型で指定
(整数型)int num = 65;
(文字型)string code = 'A';
- CPUの命令で指定
mov num, 65 (数字として格納)
mov code, 'A' (文字として格納)
普段何気なく使用しているデータ型や命令の役割を再確認できた。
lecture 1: C
Q:intで40億くらいの計算をすると計算が狂う
ソースコード
// calculator.c
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int x = get_int("x: ");
int y = get_int("y: ");
int z = x + y;
printf("%i\n", z);
}
実行結果
//ターミナル
make calculator
./calculator
x = 2000000000
y = 2000000000
-294967296
A: データ型ごとに使用できるメモリの量が有限であるため、それ以上の計算をするとオーバーフローしてしまうから
整数型intの使用量は32bit
→負の数も入れて大体-20億~+20億くらいまで数えられる
ex)簡略化のために3bitで考える
3bitは0~7まで数えられるが、8を数えようとすると、、、
7: 111
8: (1)000→0と同じ
bitを超えた数を考えると、数値が反転してしまう→intに限らずfloatやlongでも同様
→数を扱う際は、オーバーフローや桁落ちなどに注意した方がいいな
lecture 2: Arryas
Q: コンパイルって聞くけど具体的に何をしてるの??
基本的には人間が書いたコードをコンピュータが認識できるコードに変換する処理のこと
→具体的な動作は??
A: コンパイルで行われていること
- 前処理
headerの#includeの中身を取得#include <cs50.h> #include <stdio.h>
- コンパイル
人が描いたコードをアセンブリ言語に変換(より機械語に近い低レイヤーの言語) - アセンブリ
アセンブリコードをバイナリデータに変換 - リンキング
変換したバイナリデータをそれぞれ結合する
Q': なぜ1回アセンブリ言語に変換する必要があるのだろうか??最初からバイナリに変換すればよくないか??
A': アセンブリに変換したほうが開発的に効率的だから
- デバックのしやすさ
開発者がソースコード→バイナリの変換処理を開発する際に、色々最適化とかしたい
・いきなりバイナリだと可読性が皆無
・アセンブリで最低限人間が読める形のほうが開発しやすい - CPUごとの命令セットに対応しやすい
CPUごとに命令の仕方が異なる→バイナリの記述も異なる
・一度アセンブリを経由したほうが、CPUごとの命令セットに対応しやすい - 再利用性がある
アセンブリ→バイナリ処理を再利用できる
・もし直接バイナリに変換した場合、プログラミング言語毎にバイナリ変換の処理を開発しないといけない